2013-02-08 5 views
10

ho fatto ciao applicazione mondo dal libro le applicazioni Android per principianti assoluti e app from here Entrambi sta funzionando benissimo su emulatore convertitore di temperatura, ma quando provo a farlo funzionare su Samsung Note 2 seguente errore sta venendo su LogCatJNI ERRORE (app bug): si accede stantio 0xbc00021 riferimento locale (indice 8 in una tabella di dimensione 8)

02-08 07:22:18.665: E/dalvikvm(30944): JNI ERROR (app bug): accessed stale local reference 0xbc00021 (index 8 in a table of size 8) 
02-08 07:22:18.665: E/dalvikvm(30944): VM aborting 
02-08 07:22:18.665: A/libc(30944): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1), thread 30944 (oid.temperature) 

Entrambe le applicazioni si aprono layout di spettacoli con il titolo, ma non mostra altre viste nel layout

campioni funziona bene

dispositivo: Nota 2 Samsung-gt_n7100

IDE: Eclipse versione 3.8

OS: Windows a 64 bit 7

+1

Guarda: http://android-developers.blogspot.cz/2011/11/jni-local-reference-changes-in-ics.html –

risposta

55

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.

  1. È 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.

  2. È 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

+5

Seriamente, questo dovrebbe andare sulla prima pagina di Android. Ora mi sto chiedendo quante migliaia di app native potrebbero bloccarsi casualmente a causa di questo problema, gesù ... – RelativeGames

+0

@Alexey compagno im nuovo ad Android e di fronte lo stesso problema http://stackoverflow.com/questions/21423036/sqlite3- exception-database-disk-image-is-malformed pls indica come posso implementare il tuo codice ..Im rettificandolo dalle ultime 3 settimane :( – Gattsu

+0

@ManishYadav Il wrapper jni attorno alla libreria sqlite probabilmente ha lo stesso errore di cui sto parlando qui, ma non posso dirlo con certezza senza guardare il wrapper jni (c-side) stesso Dovresti collegare alla tua domanda sia il codice jni-side che il codice ji c-side Inoltre, hai considerato l'utilizzo del wrapper standard di Android attorno a sqlite? È veloce e sarà sufficiente per quasi tutto (eccetto ricerca localizzata in inglese) , indici personalizzati e pochi altri oggetti usati raramente) – Alexey

Problemi correlati