Question

J'essaie d'accéder au message de manière jhrowable tout en remettant une exception générée lorsque je ne parviens pas à trouver une classe. Cependant, je ne peux pas accéder à l'ID de message de getMessage () sur l'objet jthrowable et je ne sais pas pourquoi. J'ai essayé de remplacer la signature de getMessage par " () Ljava / lang / String " (sans le point-virgule à la fin, mais c'est nécessaire, non?) sans joie. Je suis confus à ce sujet. J'ai même essayé de remplacer getMessage par toString, et cela ne fonctionnait pas. Évidemment, je fais quelque chose d'anormalement faux ici.

Voici le code que j'utilise:

jthrowable java_exception;
jclass java_class;
jmethodID method;

java_exception = (*jEnv)->ExceptionOccurred(jEnv);
assert (java_exception != NULL);
java_class = (*jEnv)->GetObjectClass (jEnv, java_exception);
assert (java_class != NULL);
method = (*jEnv)->GetMethodID (jEnv, java_class, "getMessage", "()Ljava/lang/String;");
if (method == NULL) {
printf ("Seriously, how do I get here?!\n");
(*jEnv)->ExceptionDescribe (jEnv);
return;
}

La sortie de ce code (entre autres) ressemble à ceci:

  

Sérieusement, comment puis-je arriver ici ?!
  Exception dans le fil " main " java.lang.NoClassDefFoundError: com / planet / core360 / docgen / Processeur

javap -p -s java.lang.Throwable me donne ceci:

  

Compilé à partir de "Throwable.java"

  La classe publique java.lang.Throwable étend java.lang.Object implémente java.io.Serializable {
  ...
  public java.lang.String getMessage ();
    Signature: () Ljava / lang / String;
  ...

Était-ce utile?

La solution

D'accord, il semble donc que mon problème est que GetObjectClass n'agit pas comme vous le souhaiteriez, ou au moins ses résultats ne sont pas utiles. d'obtenir des méthodes. Remplacer cette partie du code par ceci fonctionne:

java_class = (*jEnv)->FindClass (jEnv, "java/lang/Throwable");
method = (*jEnv)->GetMethodID (jEnv, java_class, "getMessage", "()Ljava/lang/String;");

Incroyablement étrange, ça. J'espère cependant que cela aidera quelqu'un d'autre à l'avenir.

Autres conseils

J'ai essayé votre approche et cela a fonctionné pour moi. Quelques choses cependant: j'utilise l'interface C ++ (bien que cela ne fasse aucune différence), et j'utilise Java 6 update 10, édition x64 sur Ubuntu 8.04. La version et / ou la plate-forme Java utilisée fera peut-être une différence.

#include <cstdio>
#include <jni.h>

int
main(int argc, char** argv)
{
    if (argc != 3) {
        std::fprintf(stderr, "usage: %s class message\n", argv[0]);
        return 1;
    }

    JavaVM* jvm;
    void* penv;
    JavaVMInitArgs args = {JNI_VERSION_1_6};

    if (jint res = JNI_CreateJavaVM(&jvm, &penv, &args)) {
        std::fprintf(stderr, "Can's create JVM: %d\n", res);
        return -res;
    }

    JNIEnv* env(static_cast<JNIEnv*>(penv));
    jint vers(env->GetVersion());
    std::printf("JNI version %d.%d\n", vers >> 16, vers & 0xffff);

    env->ThrowNew(env->FindClass(argv[1]), argv[2]);
    jthrowable exc(env->ExceptionOccurred());
    std::printf("Exception: %p\n", exc);
    if (exc) {
        jclass exccls(env->GetObjectClass(exc));
        jclass clscls(env->FindClass("java/lang/Class"));

        jmethodID getName(env->GetMethodID(clscls, "getName", "()Ljava/lang/String;"));
        jstring name(static_cast<jstring>(env->CallObjectMethod(exccls, getName)));
        char const* utfName(env->GetStringUTFChars(name, 0));

        jmethodID getMessage(env->GetMethodID(exccls, "getMessage", "()Ljava/lang/String;"));
        jstring message(static_cast<jstring>(env->CallObjectMethod(exc, getMessage)));
        char const* utfMessage(env->GetStringUTFChars(message, 0));

        std::printf("Exception: %s: %s\n", utfName, utfMessage);
        env->ReleaseStringUTFChars(message, utfMessage);
        env->ReleaseStringUTFChars(name, utfName);
    }
    return -jvm->DestroyJavaVM();
}

J'ai utilisé jnitest java / lang / InternalError 'Hello, world!' pour mes tests; n'hésitez pas à essayer avec différents types d'exceptions!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top