2012-06-19 57 views
5

我有一個具有本機代碼的Android應用程序。本地代碼需要從java代碼中獲取特定的值;此值定期更新,所以我需要在需要時使用它。我使用JNI從本地代碼調用Java代碼。Android:JNI錯誤(應用程序錯誤):本地參考表溢出(最大= 512)

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) 

所有類似的問題在網上有共同的答案,更多的資源需要被釋放。任何人都可以告訴我可以在這種情況下釋放哪些其他資源?

謝謝。

回答

6

您需要通過

env->CallStaticObjectMethod(bridgeClass, method) 

刪除本地裁判的返回值如下:

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

非常感謝! – Jake

+1

我該怎麼做? – patrick

+1

@patrick'env-> DeleteLocalRef(returnValue);'。 – Malcolm

相關問題