调用NewStringUTF/DeleteLocalRef触发JNI失效本地引用错误求助
JNI错误:删除字符串本地引用时触发"stale local reference"报错
我在Android Studio中创建了基础的「Native C++」应用,修改native-lib.cpp代码如下:
#include <jni.h> #include <string> extern "C" JNIEXPORT jstring JNICALL Java_com_example_jnitest_MainActivity_stringFromJNI(JNIEnv* env, jobject /* this */) { jstring jniHeader = env->NewStringUTF("x-foo"); env->DeleteLocalRef(jniHeader); // 此处触发报错 std::string hello = "Hello from C++"; return env->NewStringUTF(hello.c_str()); }
调试运行时出现以下错误:
09-09 17:23:25.371 7512-7512 E/example.jnites: JNI ERROR (app bug): accessed stale Local 0x79 (index 7 in a table of size 7) [ 09-09 17:23:25.372 7512: 7512 F/example.jnites ] java_vm_ext.cc:577] JNI DETECTED ERROR IN APPLICATION: use of deleted local reference 0x79 java_vm_ext.cc:577] from java.lang.String com.example.jnitest.MainActivity.stringFromJNI()
我想知道是否不能对jstring类型调用DeleteLocalRef()?相关JNI文档里没有提到这个限制。另外我尝试用PushLocalFrame()/PopLocalFrame()替代手动删除本地引用,仍然会报错;创建全局引用也只是改变了错误类型,问题依旧存在。
补充环境信息:
- 运行环境:Mac
- Android模拟器:API 30
- build.gradle配置:compileSdkVersion 29,targetSdkVersion 28,minSdkVersion 28
- Android Studio版本:4.2.2,运行时版本11.0.8+10-b944.6916264 x86_64
内容的提问来源于stack exchange,提问作者Edward Falk
相关产品推荐
相关产品推荐

