如何从JNI中捕获的Java异常中获取消息

时间:2014-11-22 00:06:44

标签: java java-native-interface

我试图捕获Java抛出的异常并将异常消息报告给我自己的日志框架。但是,如果我这样做,就会出现明显的鸡蛋问题;我尝试使用Java getMessage()调用来获取消息:

jthrowable e = env->ExceptionOccurred();
jclass clazz = env->GetObjectClass(e);
jmethodID getMessage = env->GetMethodID(clazz,
                                        "getMessage",
                                        "()Ljava/lang/String;");

但我实际上无法解析getMessage,因为挂起的异常导致JVM在我调用GetObjectClass时中止。

是否有一种安全的方法可以预先获取所有例外的jmethodID?如果我在应用程序启动时获取Throwable.getMessage()的方法ID,那么jmethodID是否可以移植到其他类?或者是调用env->ExceptionClear()并继续使用相同的本地jthrowable引用的适当方法?

1 个答案:

答案 0 :(得分:5)

以下作品;但是,我不知道它是否是正确的方法:

jthrowable e = env->ExceptionOccurred();
env->ExceptionClear(); // clears the exception; e seems to remain valid

jclass clazz = env->GetObjectClass(e);
jmethodID getMessage = env->GetMethodID(clazz,
                                        "getMessage",
                                        "()Ljava/lang/String;");
jstring message = (jstring)env->CallObjectMethod(e.get(), getMessage);
const char *mstr = env->GetStringUTFChars(message, NULL);
// do whatever with mstr
env->ReleaseStringUTFChars(message, mstr);
env->DeleteLocalRef(message);
env->DeleteLocalRef(clazz);
env->DeleteLocalRef(e);