WebHU - Programozási kérdések és válaszok

Android CheckJNI: Hogyan lehet ki/bekapcsolni (emulátoron)? A dokumentáció hibásnak tűnik

Eltöltöttem egy kis időt a checkjni mód vizsgálatával egy Android emulátor segítségével az alkalmazásommal. Bár meg van írva (a http://android-developers.blogspot.com/2011/11/jni-local-reference-changes-in-ics.html), hogy a CheckJNI alapértelmezés szerint be van kapcsolva, ha a debuggable="true" & targetSdkVersion legalább Ice Cream Szendvics (az AndroidManifest.xml fájlban) – A CheckJNI hibakeresési kimeneti kiíratása (figyelmeztetés és hibák) továbbra is kinyomtatásra kerül a DDMS-ben, még akkor is, ha Gingerbread értékeket használok, és Gingerbread emulátorra telepítem.

Az egyetlen különbség, amit találtam, az az, hogy az Ice Cream Sandwich emulátoron lévő CheckJNI figyelmeztetések (függetlenül attól, hogy mik voltak az értékek az AndroidManifest.xml fájlban) az alkalmazás összeomlását okozzák a tiszteletben tartott figyelmeztetéssel – miközben csak egy Gingerbread emulátor (teszteltem egy DeleteGlobalRef-et, amelyet helyi hivatkozáson használnak a figyelmeztetés előidézésére).

Két nem információs napló van kinyomtatva az AndroidManifest.xml-nek megfelelően – a CheckJNI mód naplóit azonban ez nem érinti.

Itt vannak a naplók -

#Az ICS-emulátoron Az alkalmazás telepítése után:

 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)

Hibakódnál (összeomlás):

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)

#Mézeskalácson:

Az alkalmazás telepítése után:

01-19 08:43:01.491: D/AndroidRuntime(32): CheckJNI is ON

Loading the app:

Nincsenek fontos naplók

Hibakódnál (nincs összeomlás):

01-19 08:45:20.079: W/dalvikvm(304): JNI: DeleteGlobalRef(0x40608718) failed to find entry (valid=1)

Tehát a kérdésem az, hogy hogyan kapcsoljam be/ki – és hogyan befolyásolja másképp az alkalmazást (vagy a naplókat), amikor be van kapcsolva?

Kösz.


Válaszok:


1

Az emulátor különleges. A CheckJNI mindig be van kapcsolva az emulátorban.

Tovább fokozza a zavarodottságát, hogy az Ön által megjelenített DeleteGlobalRef figyelmeztetés nem volt a CheckJNI előzetes ICS része. Ez alapvetően egy kis hibakereső kimenet volt a régi lokális/globális referencia megvalósításban. Az ICS-munka részeként ez átkerült a CheckJNI-be, ahol valószínűleg mindig is ott kellett volna lennie.

Tehát minden viselkedés, amit lát, szó szerint „elvárható”, még ha kissé meglepő is!

Ha megnézi a http://developer.android.com/guide/practices/design/jni.html lehet, hogy ki tudod kapcsolni a CheckJNI-t az emulátorban, bár nem tudom, miért szeretnéd, ezért nem foglak bátorítani ennél tovább! Amit igazán szeretne tenni, az az, hogy kijavítsa az esetleges JNI-hibáit, hogy alkalmazásai továbbra is működjenek az Android jövőbeli verzióin :-)

(Csalódott vagyok a "JNI FIGYELMEZTETÉS: DeleteGlobalRef on non-global 0x41339550 (type=1)" diagnosztika minősége miatt --- Meglátom, hogy pontosabb legyen a "non-global"-nál, és eltávolítsam a "type=" 1", aminek legalább meg kell egyeznie a ‹jni.h› sorában szereplő referenciatípusok egyikének számértékével.)

Ha ezen a területen keresgél, nézze meg a következőt is: http://code.google.com/p/android/issues/detail?id=21674 --- a globális hivatkozások visszafelé kompatibilitása nem működik; csak helyi referenciák. Tehát ha a targetSdkVersion low beállítása nem működik az Ön számára, annak az lehet az oka, hogy amúgy is közvetett globális hivatkozásokat osztunk ki (annak ellenére, hogy a helyi hivatkozások közvetlenek lesznek).

22.01.2012
  • Tudja, hogyan akadályozhatom meg, hogy ez a JNI hiba összeomlik az ICS-ben? stackoverflow.com/ kérdések/14309521/ Köszönöm!! 14.01.2013

  • 2

    A CheckJNI kikapcsolásának lépései az emulátoron (tesztelt és nekem működött)-
    1)
    adb shell stop
    adb shell setprop dalvik.vm.checkjni false
    adb shell start
    2) Hagyja az emulátor újraindítása a képernyőn.
    3) Telepítse az apk-t. A DDMS-naplókban látnia kell, hogy a CheckJNI ki van kapcsolva.
    Alapértelmezés szerint az emulátorban minden alkalmazástelepítéskor a CheckJNI be van kapcsolva.

    Ez a link további információkat tartalmaz: http://developer.android.com/training/articles/perf-jni.html

    06.03.2013
    Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..