gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:45:01 26 4
gpt4 key购买 nike

我正在 try catch 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 引用的适当方法?

最佳答案

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

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

关于java - 如何从 JNI 捕获的 Java 异常中获取消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27072459/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com