Spędziłem trochę czasu na sprawdzeniu trybu checkjni przy użyciu emulatora Androida z moją aplikacją. Mimo że jest napisane (w http://android-developers.blogspot.com/2011/11/jni-local-reference-changes-in-ics.html), że CheckJNI jest włączone domyślnie, jeśli debuggable = "true" & targetSdkVersion jest co najmniej Ice Cream Sandwich (w pliku AndroidManifest.xml) - Zrzut roboczy debugowania CheckJNI (ostrzeżenia i błędy) jest nadal drukowany w DDMS, nawet jeśli użyję wartości Gingerbread i zainstaluję go na emulatorze Gingerbread.CheckJNI Androida: Jak wyłączyć/włączyć (na emulatorze)? Dokumentacja wydaje się być wadliwa.
Jedyną różnicą, którą znalazłem jest to, że ostrzeżenia CheckJNI na emulatorze Ice Cream Sandwich (bez względu na wartości w pliku AndroidManifest.xml) spowodują awarię aplikacji z przestrzeganym ostrzeżeniem - podczas gdy tylko one być wydrukowane w emulatorze z piernika (przetestowałem DeleteGlobalRef używany w lokalnym odnośniku w celu wywołania tego ostrzeżenia).
Istnieją dwa logi nieinformacyjne drukowane zgodnie z AndroidManifest.xml - ale nie wpływa to na logi trybu CheckJNI.
Oto logi -
#On ICS emulator Po zainstalowaniu aplikacji:
01-19 08:43:01.491: D/AndroidRuntime(32): CheckJNI is ON
Loading the app:
01-19 08:32:26.617: D/dalvikvm(590): Not late-enabling CheckJNI (already on)
(The last line is printed only when debuggable="true")
01-19 08:32:27.066: I/dalvikvm(590): Turning on JNI app bug workarounds for target SDK version 10...
(The last line is printed only when targetSdkVersion=10)
Na kodem błędu (awarii):
01-19 08:37:56.176: W/dalvikvm(651): JNI WARNING: DeleteGlobalRef on non-global 0x41339550 (type=1)
...
01-19 08:37:56.187: E/dalvikvm(651): VM aborting
01-19 08:37:56.187: A/libc(651): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1)
# Na Gingerbread:
Po zainstalowaniu aplikacji:
01-19 08:43:01.491: D/AndroidRuntime(32): CheckJNI is ON
Loading the app:
Brak ważnych dzienników
Na kodem błędu (bez awarii):
01-19 08:45:20.079: W/dalvikvm(304): JNI: DeleteGlobalRef(0x40608718) failed to find entry (valid=1)
Więc moje pytanie brzmi: w jaki sposób należy go włączyć/off - i jak powinien wpływać na aplikację (lub dzienniki) inaczej, gdy jest włączony?
Dzięki.
Czy wiesz, w jaki sposób można zapobiec temu błędowi JNI od upaść ICS? http://stackoverflow.com/questions/14309521/weird-fatal-crash-with-exifinterface-and-vm-aborting Thanks !! –