安卓 : JNI ERROR (app bug): local reference table overflow (max=512)

标签 android c++ java-native-interface

我有一个具有 native 代码的 Android 应用程序。 native 代码需要从 java 代码中获取特定值;这个值会定期更新,所以我需要在需要使用它的时候获取它。我正在使用 JNI 进行从 native 代码到 Java 代码的调用。

std::string val;
JNIEnv* env = JSC::Bindings::getJNIEnv();
jclass bridgeClass = env->FindClass("com.mypackage.MyClass");
jmethodID method = env->GetStaticMethodID(bridgeClass, "getVal", "()Ljava/lang/String;");
val = jstringToStdString(env, static_cast<jstring>(env->CallStaticObjectMethod(bridgeClass, method)));
env->DeleteLocalRef(bridgeClass);

我经常打这个电话(几乎每分钟 100 次),但我遇到了以下异常:

E/dalvikvm( 1063): JNI ERROR (app bug): local reference table overflow (max=512)
W/dalvikvm( 1063): JNI local reference table (0xcc8590) dump:
W/dalvikvm( 1063):   Last 10 entries (of 512):
W/dalvikvm( 1063):       511: 0x413c7e70 java.lang.String "ABC"
W/dalvikvm( 1063):       510: 0x40a39470 java.lang.Class<android.util.Log>
W/dalvikvm( 1063):       509: 0x413c8558 java.lang.String "9287391238192... (24 chars)
W/dalvikvm( 1063):       508: 0x413c8558 java.lang.String "8298731897198... (24 chars)
W/dalvikvm( 1063):       507: 0x413c8558 java.lang.String "1983918729387... (24 chars)
W/dalvikvm( 1063):       506: 0x413c8558 java.lang.String "9283719732827... (24 chars)
W/dalvikvm( 1063):       505: 0x413c8558 java.lang.String "1231219897173... (24 chars)
W/dalvikvm( 1063):       504: 0x413c8558 java.lang.String "8237330127537... (24 chars)
W/dalvikvm( 1063):       503: 0x413c8558 java.lang.String "1293657681298... (24 chars)
W/dalvikvm( 1063):       502: 0x413c8558 java.lang.String "1298753090172... (24 chars)
W/dalvikvm( 1063):   Summary:
W/dalvikvm( 1063):         2 of java.lang.Class (2 unique instances)
W/dalvikvm( 1063):       510 of java.lang.String (2 unique instances)
E/dalvikvm( 1063): Failed adding to JNI local ref table (has 512 entries)

网上所有类似问题的共同答案是需要释放更多资源。谁能告诉我在这种情况下我可以释放哪些其他资源?

谢谢。

最佳答案

您需要删除对返回值的本地引用

env->CallStaticObjectMethod(bridgeClass, method)

如下:

jobject returnValue = env->CallStaticObjectMethod(bridgeClass, method);
// ...
env->DeleteLocalRef(returnValue);

关于安卓 : JNI ERROR (app bug): local reference table overflow (max=512),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11109497/

相关文章:

Android NDK JNI 构建错误 : undefined reference to 'function_name'

java - 从 java 运行 native MPI 代码

java.lang.UnsatisfiedLinkError : for the second method 错误

Android Canvas 矩形改变颜色

android - 如何在 Play 商店应用描述中添加缩进?

c++ - 类内不可复制

c++ - 从 C++ 中的三元素映射中提取第二个元素

c++ - 加载 Collada 动画关节?

android - eclipse 中的“Intent 无法解析为类型”错误

android - flutter : Create directory on external storage path - path provider getExternalStorageDirectory()