java - 是什么导致 JNI 错误 "use of deleted local reference"?

标签 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") 而不会出现此错误?

最佳答案

问题是 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/

相关文章:

android - Generate Signed Bundle : Errors while building Bundle file. 'other' 有不同的根

c - 对于全局声明时间函数来说,初始化元素不是常量

java - 如何禁用未按下的按钮

java - 查看二维数组中的元素

java - 如何验证 "@"符号的字符串并传递给 if 语句

Android 退出 AsyncTask

java.lang.NoClassDefFoundError : android. support.v7.mediarouter.R$string

java - Glassfish 嵌入式无法部署 EJB 模块

c - 使用 char* a[] 与 char a[][]

你能帮我这个(C 语言)吗?