java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader

java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader

Tieni presente che esiste una convenzione di denominazione. La tua lib deve essere chiamata libexample.so .

LoadLibrary("example") cercherà libexample.so.

La libreria .so deve trovarsi all'interno dell'apk nella cartella lib (dal momento che stai sviluppando per Android, deve essere nelle cartelle lib/armeabi e lib/armeabi-v7a - perché entrambe le cartelle? Alcune versioni di Android guardano sotto lib /armeabi e alcuni guardano sotto lib/armeabi-v7a ... guarda cosa funziona per te).

Altre cose da cercare :

  • assicurati di compilare per l'architettura corretta (se compili per armeabi v5 non funzionerà su armeabiv7 o armeabiv7s).

  • assicurati che i tuoi prototipi esportati siano usati nella classe corretta (controlla l'esempio hello jni. Le tue funzioni esposte devono assomigliare a qualcosa come Java_mypackagename_myjavabridgeclass_myfunction).

Ad esempio, la funzione Java_com_example_sample_hello verrà tradotta nella classe java com.example.sample , function hello.


Attualmente sto lavorando su un'applicazione Android che trasmette la radio. Uso la libreria di decodificatore nativa che si chiama aacdecoder. Tutto andava bene fino a quando l'app non riceve un errore di arresto anomalo su alcuni dispositivi Android. Era davvero fastidioso. Perché l'app riproduce perfettamente i flussi radiofonici su quasi tutti i dispositivi tranne Samsung S6 e S6 Edge.

Il rapporto sull'arresto anomalo lo dice

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)

Come vedi, l'arresto anomalo sta dicendo che non è stato possibile caricare la libreria nativa. Ma perché? Prima di tutto ho controllato la mia struttura, se i file .so della libreria nativa si trovano correttamente.

Sembra che tutto andasse bene tranne questo errore pazzesco. Quindi, dopo alcune ricerche, scopro che alcuni dispositivi Android hanno processori a 64 bit. Questo dispositivo genera e controlla la cartella arm64 per caricare la libreria nativa. Questo era il problema. Perché il mio progetto non ha la cartella arm64. Ecco la soluzione;

defaultConfig {
    ...

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

}

Devi aggiungere questi filtri (abiFilters) ai file build.gradle del modulo dell'app. Quindi, quando il tuo dispositivo prova a eseguire la tua app, controllerà il file gradle e capirà che non dovrebbe generare alcuna cartella e utilizzare le risorse della libreria nativa esistenti. Boom, quasi risolto. Ma c'è ancora un'altra cosa.

android.useDeprecatedNdk=true

Aggiungi questa riga a gradle.properties per utilizzare Ndk deprecato.

Finalmente la mia app funziona su S6 e S6 Edge. Voglio dire, funziona su tutti i dispositivi dotati di nuovi processori a 64 bit.

Aggiornamento :

A partire da dicembre 2019 armabi e mips sono obsoleti. Gli ABI supportati sono [arm64-v8a, armeabi-v7a, x86, x86_64]

Quindi, il tuo codice dovrebbe essere così

defaultConfig {
        ...

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

    }

Questo mi ha aiutato. Condivido per qualcuno che potrebbe avere lo stesso problema.

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