java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader

 C Programming >> C C# Program >  >> C++
java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader

Vær oppmerksom på at det er en navnekonvensjon. Din lib må hete libexample.so .

LoadLibrary("eksempel") vil se etter libexample.so.

.so-biblioteket må være inne i apk-en under lib-mappen (siden du utvikler for Android, må det være under lib/armeabi- og lib/armeabi-v7a-mappene - hvorfor begge mappene? noen versjoner av Android ser under lib /armeabi og noen ser under lib/armeabi-v7a ... se hva som fungerer for deg ).

Andre ting å se etter :

  • sørg for at du kompilerer for riktig arkitektur (hvis du kompilerer for armeabi v5 vil det ikke fungere på armeabiv7 eller armeabiv7s ).

  • sørg for at de eksporterte prototypene dine brukes i riktig klasse (sjekk hello jni-eksemplet. De eksponerte funksjonene dine må se omtrent ut som Java_mypackagename_myjavabridgeclass_myfunction).

For eksempel vil funksjonen Java_com_example_sample_hello oversettes i java-klassen com.example.sample , function hello.


Jeg jobber for tiden med en Android-applikasjon som streamer radio. Jeg bruker innfødt dekoderbibliotek som kalles aacdecoder. Alt var bra til appen får krasjfeil på noen Android-enheter. Det var skikkelig irriterende. Fordi appen var perfekt spiller radiostrømmer nesten alle enheter bortsett fra Samsung S6 og S6 Edge.

Krasjrapport sier det

Fatal Exception: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/data/app/com.radyoland.android-1/base.apk”],nativeLibraryDirectories=[/data/app/com.radyoland.android-1/lib/arm64, /vendor/lib64, /system/lib64]]] couldn’t find “libaacdecoder.so”
 at java.lang.Runtime.loadLibrary(Runtime.java:366)
 at java.lang.System.loadLibrary(System.java:988)
 at com.spoledge.aacdecoder.Decoder.loadLibrary(Decoder.java:187)

Som du ser sier krasjen at den ikke kunne laste inn det opprinnelige biblioteket. Men hvorfor? Først av alt sjekket jeg strukturen min, If native library .so-filer plassert riktig.

Ser ut til at alt var i orden bortsett fra denne vanvittige feilen. Etter litt undersøkelser finner jeg ut at noen av Android-enheter har 64-bits prosessorer. Denne enheten genererer og kontrollerer arm64-mappen for å laste inn eget bibliotek. Det var problemet. Fordi prosjektet mitt ikke har arm64-mappe. Her er løsningen;

defaultConfig {
    ...

    ndk {
        abiFilters "armeabi-v7a", "x86", "armeabi", "mips"
    }

}

Du må legge til disse filtrene (abiFilters) i appmodulens build.gradle-filer. Så når enheten prøver å kjøre appen din, vil den sjekke gradle-filen og forstår at den ikke skal generere noen mappe og bruke eksisterende native bibliotekressurser. Bom, nesten løst. Men det er en ting til.

android.useDeprecatedNdk=true

Legg til denne linjen i gradle.properties for å bruke utdatert Ndk.

Endelig fungerer appen min på S6 og S6 Edge. Jeg mener det fungerer på alle enheter som har nye 64-bits prosessorer.

Oppdatering:

Fra desember/2019 er armabi og mips avviklet. Støttede ABI-er er [arm64-v8a, armeabi-v7a, x86, x86_64]

Så koden din skal være slik

defaultConfig {
        ...

        ndk {
            abiFilters "arm64-v8a", "armeabi-v7a", "x86", "x86_64"
        }

    }

Dette hjalp meg. Deler det for noen som kan komme opp med samme problem.

android {
    ....
    defaultConfig {
        ....
        ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
        }
    }
}