Vous avez l'erreur ci-dessus dans votre Android JNI app? Lisez la suite ...
À l'avant, je dirai que j'ai déjà résolu cela, à ma manière, mais je sens que quelque chose dans le système de construction Android (peut-être concernant Eclipse) est cassé, et j'espère sauver quelqu'un des heures de douleur. Peut-être que d'autres ont rencontré ce problème et peuvent commenter ce qui a fonctionné pour eux.
Pendant un certain temps, j'ai eu un projet Android avec du code JNI que j'ai développé à l'aide du NDK. Puis, aujourd'hui, j'ai changé quelque chose dans le Java puis poof, je ne pouvais plus charger ma bibliothèque JNI. Elle a échoué avec une exception comme:
E/AndroidRuntime (999): Java.lang.UnsatisfiedLinkError: impossible de charger mylibrary: findLibrary a retourné null
J'ai googlé et tout essayé (reconstruction, fermeture et relance d'Eclipse, etc, etc.)
Qu'est-ce qui a finalement résolu mon problème? J'ai désinstallé physiquement mon application de l'appareil avant d'essayer une autre exécution. C'est ça. Après ça, ça a marché. Qu'est-ce qui a fonctionné pour vous?
Si vous avez un projet natif avec LOCAL_MODULE "libXYZ", assurez-vous de le charger en tant que
System.loadLibrary("XYZ");
Si vous essayez d'exécuter votre application dans un simulateur, assurez-vous que vous avez spécifié l'architecture correcte dans Exécuter -> Configurations d'exécution -> Cible (vous devrez peut-être ajouter le simulateur requis à l'aide de Fenêtre -> Android Virtual Device Manager).
J'ai eu le même problème lorsque j'essayais d'exécuter une application dans un simulateur Intel, alors que l'application utilisait une bibliothèque précompilée pour l'ARM.
J'ai aussi ce problème, mais pour ma situation, j'utilise mes bibliothèques dans un autre projet. Et je ne pense pas que ce soit une question d'Eclipse ou d'Android-ndk.
vous pouvez vérifier ces conseils qui peuvent conduire à UnsatisfiedLinkError
et cela fonctionne très bien pour moi, bonne chance :)
/your project/libs/armeabi/
MODIFIER:
UnsatisfiedLinkError
sont levées si la bibliothèque n'est pas installée dans votre app.apk, donc elle ne peut pas être liée avec succès.Dans le dossier libs, je crée un nouveau dossier appelé armeabi-v7a et copie le fichier .so d'armeabi dans le nouveau dossier. Il résout l'erreur.
Dans mon cas, lors de la création d'un Application système, le problème était lié aux autorisations. Après avoir placé les fichiers ". So" dans /system/lib/
ou /system/vendor/lib/
répertoire, j'ai modifié les autorisations allouées par défaut 600 à 755. Cela a bien fonctionné.
J'avais le même problème et voici quelques-uns des problèmes que j'ai rencontrés avec mon projet:
System.load("hello-test");
à System.loadLibrary("hello-test");
;JNIEXPORT jstring Java_com_example_testndk_TestNDK_funcNami(JNIEnv* env, jobject thiz)
: ici vous utilisez Java_<Java_package_name>_<Java-class-name>_<function-name>
;local.properties
, dans mon cas ndk.dir=<my-path-to-ndk-directory>
; etbuild.gradle
à inclure également dans defaultConfig
: ndk { moduleName "hello-test" }
.com.example.testndk
TestNDK
hello-test.c
AndroidProjects/TestNDK/app/src/main/jni
IDE: Android Studio 0.8.1.
Tout d'abord, vérifiez que vous avez les fichiers jni dans votre dossier libs dans Eclipse ou le dossier jniLibs dans Android studio. Lorsque vous archivez un fichier svn, vérifiez pour archiver également les fichiers .so.
Mon scénario était lors de la construction avec Android studio.
Lorsque vous créez dans Android studio, vos fichiers .so de bibliothèque ou (jni) doivent se trouver dans le dossier\src\main\jniLibs\armeabi ***. So.
où ces fichiers seront dans le\libs\armeabi ***. donc dans Eclipse.
Lors de la construction à l'aide d'Eclipse et de Android studio, vous devez modifier votre fichier build.gradle comme
main {
manifest.srcFile 'AndroidManifest.xml'
Java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
// Fixed Issue : "Android studio Java.lang.unsatisfiedlinkerror: couldn't load find library returned null"
// Cause : For Android studio : The JNI files should be placed in the /src/main/jniLibs folder.
// Fix : Mapping the jniLibs 's source Directories with Lib's folder
jniLibs.srcDirs = ['libs']
}
Ici, je construis le projet en utilisant à la fois le Android studio et l'Eclipse.
Aucune des réponses précédentes n'a résolu mon problème, mais cela s'est produit: Tout au long du problème, il n'y avait pas de sous-répertoire et de fichier nécessaires. Tout ce que j'avais dans mon dossier libs était un dossier armeabi contenant le fichier .so approprié, mais il devrait y en avoir 3 autres, chacun contenant un fichier .so. Je ne sais pas encore lequel des trois autres (armeabi-v7a, mips ou x86) était celui requis, mais je sais que les trois ont été générés automatiquement lorsque j'ai ajouté le fichier Application.mk dans le même dossier que Android.mk et vous êtes assuré qu'il contenait la ligne suivante:
APP_ABI := all
Pour moi, cette ligne est le seul texte là-dedans. Lorsque ndk-build est exécuté, le fichier Application.mk provoque apparemment la création de "tous" les 4 dossiers et la création des fichiers .so appropriés. Une fois Application.mk en place, j'ai de nouveau exécuté ndk-build, puis j'ai effectué un nettoyage et un effacement de mon projet Eclipse avant de réessayer. Tout fonctionnait parfaitement.
juste eu un problème similaire.
Consultez votre répertoire /data/data/your.package.name/lib
Lorsque je suis dans mon répertoire de packages, il affiche actuellement:
lib -> /mismatched_uid/settings_10037/fs_1000
j'ai probablement changé accidentellement le sharedUserId et donc la bibliothèque n'est plus accessible.
J'ai ajouté
extern "C"
avant que les fonctions ne déclarent
ex:
extern "C"
jstring
Java_lara_myapplication_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
alors l'erreur a disparu
Je venais de le faire et le problème était que le périphérique n'avait tout simplement pas assez d'espace pour installer la bibliothèque. J'ai désinstallé d'autres applications, puis cela a fonctionné.
Si vous avez un projet natif avec "libXYZ.so", assurez-vous que /system/lib/libXYZ.so n'existe pas sur votre appareil. Il existe une solution douloureuse: utilisez
System.load("/data/data/your.package.name/lib/libXY.so")
au lieu de System.loadLibrary ().
Pas besoin de rooter l'appareil .. déployer l'application sur l'émulateur et parcourir le dossier
UnsatisfiedLinkerror est résolu par ceci.Construisez à nouveau votre fichier .so par "ndk_build"
Eu un problème identique. Projet juste nettoyé et cela a fonctionné. Mystère..