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

匿名 (未验证) 提交于 2019-12-03 02:26:02

问题:

I have an android app which has native code. The native code needs to get a particular value from java code; this value updates regularly, so I need to get it when I need to use it. I am using JNI to make the call from native code to Java code.

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); 

I make this call very often (almost 100 times a minute), and I am facing the following exception:

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) 

All the similar questions online have the common answer that more resources need to be freed. Can anyone tell what other resources can I free in this case?

Thanks.

回答1:

You need to delete the local ref to the value returned by

env->CallStaticObjectMethod(bridgeClass, method) 

as follows:

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


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!