2012-06-19 15 views
5

Tengo una aplicación para Android que tiene un código nativo. El código nativo necesita obtener un valor particular del código java; este valor se actualiza regularmente, por lo que debo obtenerlo cuando lo necesite. Estoy usando JNI para hacer la llamada desde código nativo a código Java.Android: JNI ERROR (error de la aplicación): desbordamiento de la tabla de referencia local (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); 

hago este llamado muy a menudo (casi 100 veces por minuto), y yo estoy frente a la siguiente excepción:

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) 

Todas las preguntas similares en línea tienen la respuesta común que más recursos necesitan Se liberado. ¿Alguien puede decir qué otros recursos puedo liberar en este caso?

Gracias.

Respuesta

6

es necesario eliminar el árbitro local al valor devuelto por

env->CallStaticObjectMethod(bridgeClass, method) 

de la siguiente manera:

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

Muchas gracias !! – Jake

+1

¿cómo puedo hacer esto? – patrick

+1

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

Cuestiones relacionadas