2012-01-18 9 views
7

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.

Odpowiedz

4

Emulator jest wyjątkowy. CheckJNI jest zawsze włączony w emulatorze.

Dodając do zamieszania, ostrzeżenie DeleteGlobalRef nie było częścią CheckJNI przed ICS. Zasadniczo było to trochę wyników debugowania w starej lokalnej/globalnej implementacji referencyjnej. W ramach prac nad ICS przeniesiono go do CheckJNI, gdzie prawdopodobnie powinno być zawsze.

Wszystkie zachowania, które widzisz, są "oczekiwane" w dosłownym znaczeniu, nawet jeśli jest to nieco zaskakujące!

Jeśli spojrzysz na http://developer.android.com/guide/practices/design/jni.html, możesz wyłączyć funkcję CheckJNI w emulatorze, ale nie jestem pewien, czemu chcesz, więc nie zachęcam cię dalej!Co ty naprawdę chcesz zrobić, to naprawić wszelkie błędy JNI masz, aby upewnić się, że aplikacje ciągle pracuje nad przyszłymi wersjami Androida :-)

(jestem rozczarowany jakością mojego „JNI OSTRZEŻENIE: DeleteGlobalRef na nie-globalnym 0x41339550 (type = 1) "diagnostyczny --- zobaczę, że jest bardziej specyficzny niż" nieglobalny "i usuwa" typ = 1 ", który powinien przynajmniej odpowiadać wartości numerycznej jednego z typy referencyjne w wyliczeniu <jni.h>.)

Jeśli grasz w tym obszarze, zobacz także http://code.google.com/p/android/issues/detail?id=21674 - zgodność wsteczna dla odniesień globalnych nie działa; tylko lokalne odniesienia. Jeśli więc ustawienie niskiej wartości parametru targetSdkVersion nie działa, może to oznaczać, że mimo wszystko przekazujemy referencje pośrednie globalne (nawet jeśli referencje lokalnebędą bezpośrednie).

+0

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 !! –

1

kroki, aby włączyć CheckJNI off na emulatorze (przetestowane i pracował dla mnie) -
1)
adb shell zatrzymać
ADB dalvik.vm.checkjni shell setprop fałszywych
adb shell rozpocząć
2) Niech emulator uruchom ponownie na ekranie.
3) Zainstaluj apk. W dziennikach DDMS powinieneś zobaczyć, że CheckJNI jest WYŁĄCZONY.
Domyślnie przy każdej instalacji aplikacji w emulatorze jest wyświetlany komunikat CheckJNI.

Ten link zawiera więcej informacji: http://developer.android.com/training/articles/perf-jni.html

Powiązane problemy