2012-06-19 18 views
5

Yerel kod içeren bir android uygulamasına sahibim. Yerel kod, java kodundan belirli bir değer almalıdır; Bu değer düzenli olarak güncellenir, bu yüzden onu kullanmam gerektiğinde almam gerekir. Yerel koddan Java koduna çağrı yapmak için JNI kullanıyorum.Android: JNI ERROR (uygulama hatası): yerel referans tablosu taşması (max = 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); 

çok sık bu çağrıyı (neredeyse 100 kat bir dakika) yapmak ve aşağıdaki özel durum bakacak ediyorum:

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) 

tüm benzer sorular çevrimiçi daha fazla kaynak gerektiğini ortak cevabı özgür olmak Bu durumda başka hangi kaynakların özgür olabileceğini bilen var mı?

Teşekkürler.

cevap

6

Sen şöyle

env->CallStaticObjectMethod(bridgeClass, method) 

tarafından döndürülen değere yerel ref silmeniz gerekir:

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

Çok teşekkürler !! – Jake

+1

bunu nasıl yapabilirim? – patrick

+1

@patrick 'env-> DeleteLocalRef (returnValue);'. Android Studio'da yukarıdaki kodu kullanmak için – Malcolm