是什么原因导致JNI错误“使用已删除的本地引用”?

时间:2018-07-16 17:38:36

标签: java android c jvm java-native-interface

我有一个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")而不出现此错误?

1 个答案:

答案 0 :(得分:3)

问题是env->CallStaticObjectMethod期望将jstring作为其第3个参数,而是被提供了字符串文字。

首先创建jstring

jstring arg = env->NewStringUTF("os.name");
jstring result = (jstring) env->CallStaticObjectMethod(sysclazz, getPropertyMethod, arg);

解决了这个问题。