我有一个 Android 应用程序,当应用程序启动时(在 Activity.onCreate
中)调用以下 C 方法。
extern "C"
JNIEXPORT jstring JNICALL
Java_com_google_oboe_test_oboetest_MainActivity_stringFromJNI(
JNIEnv *env,
jobject instance) {
jclass sysclazz = env->FindClass("java/lang/System");
jmethodID getPropertyMethod = env->GetStaticMethodID(sysclazz, "getProperty", "(Ljava/lang/String;)Ljava/lang/String;");
jstring result = (jstring) env->CallStaticObjectMethod(sysclazz, getPropertyMethod, "os.name");
return result;
}
当调用此方法时,应用程序崩溃并且出现错误:
JNI 检测到应用程序错误:使用已删除的本地引用 0xd280e8d5
一步调试显示是这一行导致了崩溃:
jstring result = (jstring) env->CallStaticObjectMethod(sysclazz, getPropertyMethod, "os.name");
是什么导致了这个错误?我如何使用 JNI 调用 System.getProperty("os.name")
而不会出现此错误?
最佳答案
问题是 env->CallStaticObjectMethod
需要一个 jstring
作为它的第三个参数,而不是提供一个字符串文字。
首先创建一个jstring
jstring arg = env->NewStringUTF("os.name");
jstring result = (jstring) env->CallStaticObjectMethod(sysclazz, getPropertyMethod, arg);
解决了问题。
关于java - 是什么导致 JNI 错误 "use of deleted local reference"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51367339/