Подтвердить что ты не робот

Android NDK java.lang.UnsatisfiedLinkError: findLibrary возвращается null

Имея вышеуказанную ошибку в приложении Android JNI? Читайте дальше...

Наверху, я скажу, что я уже решил это по-своему, но я чувствую, что что-то в системе Android-сборки (возможно, в отношении Eclipse) сломано, и я надеюсь, чтобы спасти кого-то еще час боли, Возможно, другие столкнулись с этой проблемой и могут прокомментировать, что с ними работало.

Некоторое время у меня был проект Android с некоторым кодом JNI, который я разработал с помощью NDK. Затем, сегодня, я что-то изменил в java-коде, а затем poof, я больше не мог загружать свою библиотеку JNI. Он завершился с исключением:

E/AndroidRuntime (999): java.lang.UnsatisfiedLinkError: не удалось загрузить mylibrary: findLibrary возвратил null

Я googled и пробовал все (восстановление, закрытие и перезапуск Eclipse и т.д. и т.д.)

Что, наконец, устранило мою проблему? Я физически удалил свое приложение с устройства, прежде чем пытаться выполнить другой запуск. Это. После этого все сработало. Что сработало для вас?

4b9b3361

Ответ 1

Если у вас есть собственный проект с LOCAL_MODULE "libXYZ", обязательно загрузите его как

System.loadLibrary("XYZ");

Ответ 2

Если вы пытаетесь запустить приложение в симуляторе, убедитесь, что вы указали правильную архитектуру в Run → Run Configurations → Target (вам может потребоваться добавить необходимый имитатор, используя Window → Android Virtual Device Manager).

У меня была такая же проблема при попытке выполнить приложение в симуляторе Intel, в то время как приложение использовало библиотеку, предварительно скомпилированную для ARM.

Ответ 3

У меня тоже есть эта проблема, но для моей ситуации я использую свои библиотеки в другом проекте. И я не думаю, что это вопрос затмения или андроида-ndk.

вы можете проверить эти советы, которые могут привести к UnsatisfiedLinkError, и он отлично подходит для меня, удачи:)

  • должен следовать правилу имени интерфейса JNI (вы сказали, что загрузили библиотеку раньше, поэтому можете игнорировать это), а библиотеки должны находиться в каталоге /your project/libs/armeabi/
  • если вы убедитесь, что все это сделано, вы должны убедиться, что ваши сгенерированные библиотеки установлены в ваш app.apk, в противном случае он все равно не сможет найти lib и сообщить вам об ошибке. для этого щелкните правой кнопкой мыши по имени проекта eclipse и перейдите в Путь сборки - Настроить путь сборки, в меню слева выберите Путь сборки Java, затем нажмите вкладку Заказ и Экспорт на правой панели, установите флажок перед именем вашей библиотеки и нажмите ОК, затем очистить, перестроить и запустить проект, а ваши библиотеки будут установлены в app.apk, все будет сделано.

enter image description here

enter image description here

enter image description here

EDIT:

  • в слове UnsatisfiedLinkError выдаются, если библиотека не установлена ​​в ваш app.apk, поэтому она не может быть успешно связана.

Ответ 4

Внутри папки libs я создаю новую папку под названием armeabi-v7a и копирую файл .so из armeabi в новую папку. Он разрешает ошибку.

Ответ 5

В моем случае при создании Системного приложения проблема была связана с разрешениями. Поместив файлы .so в каталог /system/lib/ или /system/vendor/lib/, я изменил назначенные по умолчанию разрешения от 600 до 755. Он работал хорошо.

Ответ 6

У меня была одна и та же проблема, и это некоторые из проблем, которые были у меня с моим проектом:


  • Переход от 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>; и
  • Обновление my 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.

Ответ 7

Сначала проверьте, есть ли файлы jni внутри папки libs в папке eclipse или jniLibs в студии Android. Когда вы регистрируетесь в любом svn, перекрестно проверяете также файлы .so.

Мой сценарий был при создании студии Android.

Когда вы строите студию Android, файлы вашей библиотеки .so или (jni) должны находиться внутри папки \src\main\jniLibs\armeabi ***. поэтому.

где эти файлы будут находиться внутри \libs\armeabi ***, поэтому в eclipse.

При создании с использованием как 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  source Directories with Lib folder
            jniLibs.srcDirs = ['libs']
}

Здесь я создаю проект, используя как студию android, так и eclipse.

Ответ 8

просто возникла аналогичная проблема.

Проверьте каталог /data/data/your.package.name/lib

Когда я ls в моем каталоге пакетов в настоящее время отображается:

lib -> /mismatched_uid/settings_10037/fs_1000

Возможно, я случайно переключил sharedUserId и, следовательно, библиотека больше не может быть доступна.

Ответ 9

Ни один из предыдущих ответов не разрешил мою проблему, но это произошло: все вместе проблема заключалась в том, что необходимых подкаталогов и файлов не было. Все, что у меня было в папке с папками 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, прежде чем повторять попытку. Все было отлично.

Ответ 10

Не нужно запускать приложение device.deploy на эмуляторе и просматривать папку

Ответ 11

Если у вас есть родной проект с "libXYZ.so", убедитесь, что /system/lib/libXYZ.so не существует на вашем устройстве. Существует мучительное обходное решение: используйте

System.load("/data/data/your.package.name/lib/libXY.so") 

вместо System.loadLibrary().

Ответ 12

Я только что это произошло, и проблема в том, что устройству просто не хватило места для установки библиотеки. Я удалил некоторые другие приложения, а затем сработал.

Ответ 13

Я добавил

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());
}

тогда ошибка исчезла

Ответ 14

Имела идентичную проблему. Просто убрал проект, и он сработал. Тайна..

Ответ 15

UnsatisfiedLinkerror решается этим. Обновите свой .so файл снова "ndk_build"