2013-05-18 23 views
7

Sto restituendo una jstring da un metodo JNI. Eliminare il riferimento locale ad esso prima di restituire il valore.Chiamare DeleteLocalRef nell'interfaccia java originale

JNIEXPORT jstring JNICALL TestJNIMethod(JNIEnv* env, jclass) 
{ 
    jstring test_string = env->NewStringUTF("test_string_value"); 
    env->DeleteLocalRef(test_string); 
    return test_string; 
} 

Sarebbe il metodo Java chiamata ancora in grado di accedere al jstring restituita o sarebbe la pulizia Garbage collector la memoria?

risposta

18

No, non lo farà, tuttavia il codice funzionerà su versioni Android precedenti a ICS. Da ICS su questo codice fallirà correttamente.

In generale non è necessario eliminare autonomamente i riferimenti locali, una volta che la funzione JNI viene restituita a Java, i riferimenti otterranno il GC.

L'eccezione a questa regola è se ne crei molti, forse in un ciclo. Quindi è possibile riempire la tabella di riferimento locale. Vedi IBM: Overview of JNI object references.

Si consiglia di leggere JNI Local Reference Changes in ICS. Anche se non stai scrivendo per Android, identifica ancora molti errori comuni.