Dal android 4.0 garbage collector è stato cambiato. Ora sposta oggetti attorno durante la garbage collection, che può causare molti problemi.
Immagina di avere una variabile statica che punta a un oggetto e quindi questo oggetto viene spostato da gc. Poiché Android utilizza puntatori diretti per oggetti java, ciò significherebbe che la variabile statica ora punta a un indirizzo casuale nella memoria, non occupato da alcun oggetto o occupato da un oggetto di tipo diverso. Ciò garantisce quasi che otterrai EXC_BAD_ACCESS la prossima volta che utilizzi questa variabile.
Così android ti dà errore JNI ERROR (errore app) per impedirti di ottenere un EXC_BAD_ACCESS indefinibile. Ora ci sono due modi per evitare questo errore.
È possibile impostare targetSdkVersion nel manifest alla versione 11 o inferiore. Questo abiliterà la modalità di compatibilità dei bug di JNI e preverrà tutti i problemi del tutto. Questo è il motivo per cui i tuoi vecchi esempi stanno funzionando.
È possibile evitare l'utilizzo di variabili statiche che puntano a oggetti java o creare riferimenti a jobject globali prima di memorizzarli chiamando env-> NewGlobalRef (ref).
Forse uno degli esempi più importanti qui è mantenere gli oggetti jclass. Normalmente, inizializzerai la variabile jclass statica durante JNI_OnLoad, poiché gli oggetti di classe rimangono nella memoria finché l'applicazione è in esecuzione.
Questo codice porterà ad un incidente:
static jclass myClass;
JNIEXPORT jint JNICALL JNI_OnLoad (JavaVM * vm, void * reserved) {
myClass = env->FindClass("com/example/company/MyClass");
return JNI_VERSION_1_6;
}
Anche se questo codice verrà eseguito bene:
static jclass myClass;
JNIEXPORT jint JNICALL JNI_OnLoad (JavaVM * vm, void * reserved) {
jclass tmp = env->FindClass("com/example/company/MyClass");
myClass = (jclass)env->NewGlobalRef(tmp);
return JNI_VERSION_1_6;
}
Per ulteriori esempi si veda link fornito da Marek Sebera: http://android-developers.blogspot.cz/2011/11/jni-local-reference-changes-in-ics.html
Guarda: http://android-developers.blogspot.cz/2011/11/jni-local-reference-changes-in-ics.html –