Android NDK java.lang.UnsatisfiedLinkError: findLibrary вернул ноль
Имеете вышеуказанную ошибку в вашем приложении JNI для Android? Читать дальше...
Вначале я скажу, что я уже решил это по-своему, но я чувствую, что что-то в системе сборки Android (возможно, в отношении Eclipse) сломалось, и я надеюсь сэкономить кому-то еще несколько часов боли. Возможно, другие сталкивались с этой проблемой и могут прокомментировать, что сработало для них.
Некоторое время у меня был проект Android с некоторым JNI-кодом, который я разработал с использованием NDK. Затем, сегодня я что-то изменил в коде java, а затем poof, я больше не мог загружать свою библиотеку JNI. Это не удалось с исключением как:
E / AndroidRuntime (999): java.lang.UnsatisfiedLinkError: Не удалось загрузить mylibrary: findLibrary вернул ноль
Я гуглил и пробовал все (пересборка, закрытие и перезапуск Eclipse и т. Д. И т. Д.)
Что в итоге решило мою проблему? Я физически удалил свое приложение с устройства перед тем, как повторить попытку. Вот и все. После этого все заработало. Что сработало для вас?
17 ответов
Если у вас есть собственный проект с LOCAL_MODULE "libXYZ", обязательно загрузите его как
System.loadLibrary("XYZ");
Если вы пытаетесь запустить свое приложение в симуляторе, убедитесь, что вы указали правильную архитектуру в "Выполнить" -> "Конфигурации запуска" -> "Цель" (вам может потребоваться добавить требуемый симулятор с помощью "Окно" -> "Диспетчер виртуальных устройств Android").
У меня была такая же проблема при попытке запустить приложение в симуляторе Intel, когда приложение использовало предварительно скомпилированную библиотеку для ARM.
У меня тоже есть эта проблема, но для моей ситуации я использую свои библиотеки в другом проекте. И я не думаю, что это вопрос затмения или android-ndk.
Вы можете проверить эти советы, которые могут привести к UnsatisfiedLinkError
и у меня все отлично работает, удачи:)
- должен следовать правилу именования интерфейса JNI (вы сказали, что загружали библиотеку раньше, так что вы можете игнорировать это), и библиотеки должны находиться в каталоге
/your project/libs/armeabi/
- если вы убедитесь, что все вышеперечисленное сделано, то вы должны убедиться, что ваши сгенерированные библиотеки установлены в ваш app.apk, в противном случае он все равно не сможет найти библиотеку и выдает ошибку. Для этого щелкните правой кнопкой мыши имя проекта Eclipse и перейдите в " Путь сборки" - " Настроить путь сборки", в левом меню выберите " Путь сборки Java", затем перейдите на вкладку " Порядок и экспорт " на правой панели, отметив флажок перед имя вашей библиотеки и нажмите OK, затем очистите, перестройте и запустите ваш проект, и ваши библиотеки будут установлены в app.apk, все готово.
РЕДАКТИРОВАТЬ:
- в слове,
UnsatisfiedLinkError
генерируются, если библиотека не установлена в ваш app.apk, поэтому она не может быть успешно связана.
В моем случае при создании системного приложения проблема была связана с разрешениями. После помещения файлов ".so" в /system/lib/
или же /system/vendor/lib/
каталог, я изменил назначенные разрешения по умолчанию 600 на 755. Это работало хорошо.
Внутри папки libs я создаю новую папку с именем armeabi-v7a и копирую файл.so из armeabi в новую папку. Это решает ошибку.
У меня была та же проблема, и вот некоторые из проблем, которые у меня были с моим проектом:
- Изменение от
System.load("hello-test");
вSystem.loadLibrary("hello-test");
; - Изменение сигнатуры функции C на
JNIEXPORT jstring Java_com_example_testndk_TestNDK_funcNami(JNIEnv* env, jobject thiz)
: здесь вы используетеJava_<java_package_name>_<java-class-name>_<function-name>
; - Добавление пути NDK к
local.properties
, в моем случаеndk.dir=<my-path-to-ndk-directory>
; а также - Обновление моего
build.gradle
также включить вdefaultConfig
:ndk { moduleName "hello-test" }
,
- Имя пакета:
com.example.testndk
- Имя класса Java:
TestNDK
- Имя источника C:
hello-test.c
- Расположение каталога JNI в структуре проекта:
AndroidProjects/TestNDK/app/src/main/jni
IDE: Android Studio 0.8.1.
Во-первых, проверьте, есть ли у вас файлы jni внутри папки libs в папке eclipse или jniLibs в Android Studio. Когда вы регистрируетесь в любом svn, перепроверьте также и в.so файлах.
Мой сценарий был при сборке со студией Android.
Когда вы создаете в Android Studio, ваша библиотека.so файлы или (jni) файлы должны находиться в папке \src\main\jniLibs\armeabi***. So.
где, как эти файлы будут внутри \libs\armeabi***. так в затмении.
При сборке с использованием eclipse и android studio вы должны изменить свой файл build.gradle как
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']
}
Здесь я строю проект, используя как андроид-студию, так и затмение.
Просто была похожая проблема.
Проверьте каталог /data/data/your.package.name/lib
Когда я нахожусь в моем каталоге пакета, в настоящее время он отображает:
lib -> /mismatched_uid/settings_10037/fs_1000
возможно, я случайно переключил sharedUserId и, таким образом, к библиотеке больше нельзя получить доступ.
Ни один из предыдущих ответов не решил мою проблему, но это помогло: все время проблема заключалась в том, что необходимый подкаталог и файл отсутствовали. Все, что у меня было в папке libs, - это папка armeabi, содержащая правильный файл.so, но должно быть еще 3, каждый с файлом.so в них. Пока не ясно, какой из трех других (armeabi-v7a, mips или x86) был требуемым, но я точно знаю, что все три были автоматически сгенерированы, когда я добавил файл Application.mk в ту же папку, что и Android.mk. файл, и убедитесь, что в нем есть следующая строка:
APP_ABI := all
Для меня эта строка - единственный текст там. Когда запускается ndk-build, файл Application.mk, очевидно, вызывает "все" 4 папки и надлежащие.so файлы, которые в них создаются. Как только я установил Application.mk, я снова запустил ndk-build, а затем выполнил чистую и понятную работу над моим проектом Eclipse, прежде чем пытаться снова. Все прошло отлично.
Я добавил
extern "C"
до объявления функций
например:
extern "C"
jstring
Java_lara_myapplication_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
тогда ошибка исчезла
У меня просто так было, и проблема была в том, что на устройстве просто не хватало места для установки библиотеки. Я удалил некоторые другие приложения, и тогда это сработало.
Нет необходимости рутировать устройство.. разверните приложение на эмуляторе и просмотрите папку
Если у вас есть собственный проект с "libXYZ.so", убедитесь, что /system/lib/libXYZ.so не существует на вашем устройстве. Есть обходной путь: использовать
System.load("/data/data/your.package.name/lib/libXY.so")
вместо System.loadLibrary ().
В моем случае библиотека .so загружена правильно, но не могу найти метод, как показано ниже:
Вызвано: java.lang.UnsatisfiedLinkError: Собственный метод не найден ...
После нескольких часов поиска, в чем может быть проблема, было замечено, что приложение выдает связанную ошибку только для производственной версии. Да, мы используем proguard для обфускации исходного кода, и он ломает класс обработчика библиотеки .so ... После добавления строк ниже в файл правил proguard. Все заработало как положено.
-keepclasseswithmembers,allowshrinking,allowoptimization class com.zk.android.jni.Device {
native <methods>; }
Так что, если вы используете proguard и имеете аналогичную проблему с моей. Пожалуйста, проверьте файл proguard ...
Была идентичная проблема. Просто убрал проект и все заработало. Mystery..
Добавьте следующий код в свой файл Gradle
//libs is the location of your library's folder, It varies in diffarent projects like src/main/libs etc.
android {
sourceSets.main {
jniLibs.srcDir 'libs'
}
}
Итак, Android Studio продолжает искать собственные библиотеки внутри папки jniLibs. этот код изменит путь к студии Android, чтобы искать библиотеки в папке libs
UnsatisfiedLinkerror решается этим. Создайте свой.so файл снова с помощью "ndk_build"