Frage

Ich versuche, die Nachricht in einer jthrowable zuzugreifen, während eine Ausnahme Gabe erzeugt wird, wenn ich nicht eine Klasse zu finden. Aber ich bin nicht in der Lage der Message-ID getMessage () auf dem jthrowable Objekt zuzugreifen, und ich weiß nicht, warum. Ich habe versucht, die Unterschrift von getMessage auf „() Ljava / lang / String“ (am Ende ohne das Semikolon, aber das ist notwendig, nicht wahr?) Zu ändern, ohne Freude. Ich bin verwirrt, wie die Hölle darüber. Ich habe sogar versucht getMessage mit toString ersetzen und , die hat nicht funktioniert. Offensichtlich ich tue etwas trivialer hier falsch.

Hier ist der Code verwende ich:

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;
}

Die Ausgabe dieses Codes (unter anderem) sieht wie folgt aus:

  

Im Ernst, wie bekomme ich hier ?!
  Exception in thread "main" java.lang.NoClassDefFoundError: com / Planet / core360 / docgen / Prozessor

javap -p -s java.lang.Throwable gibt mir diese:

  

Zusammengestellt von "Throwable.java"
  public class java.lang.Throwable erweitert java.lang.Object implementiert java.io.Serializable {
  ...
  public java.lang.String getMessage ();
    Unterschrift: () Ljava / lang / String;
  ...

War es hilfreich?

Lösung

Okay, so sieht es aus wie mein Problem war, dass GetObjectClass den Weg nicht handeln Sie es auf einem jthrowable erwarten würde, oder zumindest die Ergebnisse davon sind für die Zwecke des Erhaltens Methoden nicht sinnvoll. Ersetzen des Teils des Codes mit diesem funktioniert:

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

damnably ungerade, dass. Ich hoffe, das jemand anderes in der Zukunft hilft, though.

Andere Tipps

Ich habe versucht, Ihren Ansatz, und es funktionierte für mich. obwohl ein paar Dinge: Ich bin mit dem C ++ Schnittstelle (obwohl das sollte keinen Unterschied machen), und ich bin mit Java 6 Update 10, X 64 Edition, auf Ubuntu 8.04. Vielleicht ist die Java-Version und / oder Plattform verwendet wird einen Unterschied machen.

#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();
}

Ich habe jnitest java/lang/InternalError 'Hello, world!' für meine Tests verwendet; fühlen Sie sich frei mit verschiedenen Ausnahmetypen versuchen!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top