【发布时间】:2025-12-31 03:25:12
【问题描述】:
我正在开发一个使用 JNI 的应用,但在使用全局引用时出现“本地引用表溢出”错误:
art/runtime/indirect_reference_table.cc:115] JNI ERROR (app bug): local reference table overflow (max=512)
art/runtime/indirect_reference_table.cc:115] local reference table dump:
art/runtime/indirect_reference_table.cc:115] Last 10 entries (of 508):
art/runtime/indirect_reference_table.cc:115] 507: 0x13f08b80 com.company.util.jni.JniCompanyHelper$HTTPStream
art/runtime/indirect_reference_table.cc:115] 506: 0x13ef5520 com.company.util.jni.JniCompanyHelper$HTTPStream
art/runtime/indirect_reference_table.cc:115] 505: 0x13eb4a80 com.company.util.jni.JniCompanyHelper$HTTPStream
代码如下:
class Foo {
public:
Foo(){}
void doSomething(){
JNIEnv* env = getEnv();
javaObject = env->NewGlobalRef(env->CallStaticObjectMethod(...));
}
~Foo() {
JNIEnv* env = getEnv();
env->DeleteGlobalRef(javaObject);
}
private:
jobject javaObject;
};
// ...
// Run the loop in a separate thread
for(int i =0; i< 1000; i++) {
Foo foo;
foo.doSomething();
}
当我创建一个创建和销毁 1000 个 Foo 实例并运行 doSomething 的大循环时,我收到错误“本地引用表溢出”但如果我不使用 NewGlobalRef,如下所示,我不会遇到任何崩溃:
class Foo {
public:
Foo(){}
void doSomething(){
JNIEnv* env = getEnv();
jobject javaObject = env->CallStaticObjectMethod(...);
env->DeleteLocalRef(javaObject);
}
~Foo() {
}
};
有人知道我在这里缺少什么吗?
【问题讨论】:
标签: java android c++ java-native-interface