Java.lang.Unsatisfiedlinkerror: dalvik.système.PathClassLoader

y a-t-il quelqu'un qui a fait l'expérience de cette erreur?

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/org.swig.simple-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "liborg.swig.simple.example.so"

Erreur se produit lorsque je charge la bibliothèque de cette manière.

static {
    System.loadLibrary("example");
}

je suis sûr que la classe 'example' existe dans le dossier courant.

40
demandé sur Andres Cárdenas 2014-11-28 13:30:46

15 réponses

veuillez noter qu'il y a une convention d'appellation. Votre lib doit s'appeler libexample.alors ?

LoadLibrary ("example") va chercher libexample.so.

le .donc la bibliothèque doit être à l'intérieur de l'apk sous le dossier lib (puisque vous développez pour Android, il doit être sous les dossiers lib/armeabi et lib/armeabi-v7a - pourquoi les deux dossiers ? certaines versions D'Android sont disponibles sous lib/armeabi et d'autres sous lib / armeabi-v7a ... se ce qui fonctionne pour vous ).

d'Autres choses à surveiller :

  • assurez-vous de compiler pour l'architecture correcte (Si vous compilez pour armeabi v5, cela ne fonctionnera pas sur armeabiv7 ou armeabiv7s ).

  • assurez-vous que vos prototypes exportés sont utilisés dans la bonne classe (Vérifiez l'exemple hello jni. Vos fonctions exposées doivent ressembler à quelque chose comme Java_mypackagename_myjavabridgeclass_myfunction).

Par exemple, la fonction Java_com_example_sample_hello traduira dans la classe java com.exemple.de l'échantillon , en fonction de bonjour.

42
répondu MichaelCMS 2014-11-28 11:04:08

Cela m'a aidé. Partager pour quelqu'un qui pourrait venir avec le même problème.

android {
    ....
    defaultConfig {
        ....
        ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
        }
    }
}
18
répondu Alex 2016-07-05 20:33:23

ce qui a fonctionné pour moi était de placer le dossier jniLibs le dossier" main", juste à côté des dossiers "java" et "res", par exemple project - > app - > src - > main -> jniLibs

j'ai eu toutes les bibliothèques avec les noms corrects et chacun placé sur leur sous-dossier d'architecture respectif, mais j'ai toujours eu la même exception; même essayé beaucoup d'autres réponses ainsi comme la réponse acceptée ici, la compilation d'un pot avec le .ainsi libs, autre placement de le dossier jniLibs, etc.

pour ce projet, j'ai dû utiliser Gradle 2.2 et Android Plugin 1.1.0 sur Android Studio 1.5.1

10
répondu Daniel Ponticelli 2016-05-04 21:39:05

je travaille actuellement sur une application Android qui diffuse la radio. J'utilise la bibliothèque native decoder qui s'appelle aacdecoder. Tout allait bien jusqu'application se crash d'erreur sur certains appareils Android. C'était vraiment ennuyeux. Parce que l'application était parfaitement joue flux radio presque tous les appareils, sauf Samsung S6 et S6 Edge.

rapport de Crash dit que

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)

comme vous voyez que crash dit qu'il ne pouvait pas charger la bibliothèque native. Mais pourquoi? Tout d'abord, j'ai vérifié ma structure, si bibliothèque natif .donc les fichiers localisés correctement.

semble que tout allait bien sauf cette erreur folle. Puis, après quelques recherches, j'ai découvert que certains appareils android ont des processeurs 64 bits. Ce périphérique génère et vérifie le dossier arm64 pour charger la bibliothèque native. C'était le problème. Parce que mon projet n'a pas arm64 dossier. Voici la solution;

defaultConfig {
    ...

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

}

vous devez ajouter ces filtres (abiFilters) à la compilation de votre module app.gradle fichiers. Ainsi, lorsque votre périphérique essayer d'exécuter votre application, il vérifiera le fichier gradle et comprend qu'il ne doit pas générer de dossier et utiliser les ressources de bibliothèque natives existantes. Boom, presque résolu. Mais il ya encore une chose de plus.

android.useDeprecatedNdk=true

ajouter cette ligne à votre Grad.propriétés d'utilisation de Ndk déprécié.

enfin mon application fonctionne sur S6 et S6 Edge. Je veux dire qu'il fonctionne sur tous les appareils qui a de nouveaux processeurs 64 bits.

8
répondu King of Masses 2018-08-07 09:26:02

J'utilise Android Studio 3.0 et je rencontre ce problème. Et je suis sûr que l'application est construite.gradle va bien.

allez à Run - > Edit Configurations - > profilage, et désactivez "Enable advanced profiling".

ça marche pour moi. réponse de référence

6
répondu Smiles 2017-07-07 04:26:50

certains vieux outils Grad ne peuvent pas copier .ainsi les fichiers dans le dossier de construction en copiant manuellement ces fichiers dans le dossier de construction comme ci-dessous peuvent résoudre le problème:

build/intermediates/rs/{build config}/{support architecture}/

construire config: beta/production/s'asseoir/uat

architecture de support: armeabi / armeabi-v7a/mips / x86

5
répondu thanhbinh84 2016-03-25 03:20:19

-gradle.propriétés non disponible, puis ajoutez d'abord ce fichier et ajouter android.useDeprecatedNdk=true

- utilisez ce code dans build.gradle

defaultConfig {
    applicationId 'com.example.application'
    minSdkVersion 16
    targetSdkVersion 21
    versionCode 11
    versionName "1.1"
    ndk {
        abiFilters "armeabi"
    }
}
5
répondu Sanket Sangani 2018-02-16 14:18:15

C'est travaillé pour moi

si vous en avez .donc fichier dans armeabi puis mentionner à l'intérieur de ndk que le dossier seul.

defaultConfig {
        applicationId "com.xxx.yyy"
        minSdkVersion 17
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        renderscriptTargetApi 26
        renderscriptSupportModeEnabled true
        ndk {
            abiFilters "armeabi"
        }
    }

puis utiliser ce

android.useDeprecatedNdk=true;

dans gradle.fichier de propriétés

4
répondu KCN 2017-11-02 08:30:13

si vous utilisez Android studio, il vous suffit d'éditer le Grad.propriétés dans le dossier racine et ajouter android.useDeprecatedNdk=true. Puis éditer la compilation.gradle fichier de votre application, dossier, ensemble abiFilters comme ci-dessous:

android {
....
defaultConfig {
    ....
    ndk {
        abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
    }
}
}
2
répondu Faxriddin Abdullayev 2018-02-08 18:17:12

si vous utilisez un module avec du code c++ et que vous avez le même problème, vous pouvez essayer

Build -> Refresh Linked C++ Projects

vous devriez aussi ouvrir un fichier de ce module et faire

Build -> Make module "YourNativeLibModuleName"

2
répondu Sergei Belozerov 2018-02-22 10:29:00

ce qui m'a aidé était d'enregistrer le répertoire source pour les fichiers jni dans la compilation.dossier gradle. Ajoutez ceci à votre gradle fichier:

android {
    sourceSets {
        main {
            jniLibs.srcDir '[YOUR_JNI_DIR]' // i.e. 'libs'
        }
    }
}
2
répondu Boris Gitlin 2018-04-05 07:38:08

System.loadLibrary charge une bibliothèque partagée à partir de lib dossier.

Que voulez-vous dire par "je suis sûr que la classe 'example' existe dans le dossier courant"? Vous devriez mettre votre .donc, bibliothèque lib dossier.

0
répondu Suvitruf 2014-11-28 10:33:56

pour moi le problème était que NDK_ROOT n'était pas réglé.

Vérifiez votre console si:

NDK_ROOT = None [!] NDK_ROOT Non défini. Veuillez définir NDK_ROOT dans votre environnement ou en local.propriétés

Vérifier si vous avez mis:

  • NDK_ROOT and SDK_ROOT in C / C++ - > Build - >Environment
  • Android- > NDK
  • Android- > SDK
0
répondu Iris Veriris 2016-03-24 14:20:31

il pourrait s'agir d'un problème lié à l'appareil.

J'ai été faire cette erreur dispositifs MI seulement, le code fonctionnait avec tous les autres appareils.

Cela peut vous aider:

 defaultConfig{
      ...    
      externalNativeBuild {
                    cmake {
                        cppFlags "-frtti -fexceptions"
                    }
                }
    }
0
répondu AskQ 2017-07-31 09:24:28

une autre cause de crash et solution possible est décrite dans cet article: https://medium.com/keepsafe-engineering/the-perils-of-loading-native-libraries-on-android-befa49dce2db

en bref:

dans la construction.gradle

dependencies {
    implementation 'com.getkeepsafe.relinker:relinker:1.2.3'
}

EN code

static {
    try {
        System.loadLibrary("<your_libs_name>");
    } catch (UnsatisfiedLinkError e) {
        ReLinker.loadLibrary(context, "<your_libs_name>");
    }
}
0
répondu ilyamuromets 2018-05-08 07:54:44