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.
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.
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"
}
}
}
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
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.
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
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
-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"
}
}
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
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"
}
}
}
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"
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'
}
}
}
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.
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
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"
}
}
}
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>");
}
}