Ответ 1
Если у вас есть собственный проект с LOCAL_MODULE "libXYZ", обязательно загрузите его как
System.loadLibrary("XYZ");
Имея вышеуказанную ошибку в приложении Android JNI? Читайте дальше...
Наверху, я скажу, что я уже решил это по-своему, но я чувствую, что что-то в системе Android-сборки (возможно, в отношении Eclipse) сломано, и я надеюсь, чтобы спасти кого-то еще час боли, Возможно, другие столкнулись с этой проблемой и могут прокомментировать, что с ними работало.
Некоторое время у меня был проект Android с некоторым кодом JNI, который я разработал с помощью NDK. Затем, сегодня, я что-то изменил в java-коде, а затем poof, я больше не мог загружать свою библиотеку JNI. Он завершился с исключением:
E/AndroidRuntime (999): java.lang.UnsatisfiedLinkError: не удалось загрузить mylibrary: findLibrary возвратил null
Я googled и пробовал все (восстановление, закрытие и перезапуск Eclipse и т.д. и т.д.)
Что, наконец, устранило мою проблему? Я физически удалил свое приложение с устройства, прежде чем пытаться выполнить другой запуск. Это. После этого все сработало. Что сработало для вас?
Если у вас есть собственный проект с LOCAL_MODULE "libXYZ", обязательно загрузите его как
System.loadLibrary("XYZ");
Если вы пытаетесь запустить приложение в симуляторе, убедитесь, что вы указали правильную архитектуру в Run → Run Configurations → Target (вам может потребоваться добавить необходимый имитатор, используя Window → Android Virtual Device Manager).
У меня была такая же проблема при попытке выполнить приложение в симуляторе Intel, в то время как приложение использовало библиотеку, предварительно скомпилированную для ARM.
У меня тоже есть эта проблема, но для моей ситуации я использую свои библиотеки в другом проекте. И я не думаю, что это вопрос затмения или андроида-ndk.
вы можете проверить эти советы, которые могут привести к UnsatisfiedLinkError
, и он отлично подходит для меня, удачи:)
/your project/libs/armeabi/
EDIT:
UnsatisfiedLinkError
выдаются, если библиотека не установлена в ваш app.apk, поэтому она не может быть успешно связана.Внутри папки libs я создаю новую папку под названием armeabi-v7a и копирую файл .so из armeabi в новую папку. Он разрешает ошибку.
В моем случае при создании Системного приложения проблема была связана с разрешениями. Поместив файлы .so в каталог /system/lib/
или /system/vendor/lib/
, я изменил назначенные по умолчанию разрешения от 600 до 755. Он работал хорошо.
У меня была одна и та же проблема, и это некоторые из проблем, которые были у меня с моим проектом:
System.load("hello-test");
в System.loadLibrary("hello-test");
;JNIEXPORT jstring Java_com_example_testndk_TestNDK_funcNami(JNIEnv* env, jobject thiz)
: здесь вы используете Java_<java_package_name>_<java-class-name>_<function-name>
;local.properties
, в моем случае ndk.dir=<my-path-to-ndk-directory>
; иbuild.gradle
, которое также будет включено в defaultConfig
: ndk { moduleName "hello-test" }
.com.example.testndk
TestNDK
hello-test.c
AndroidProjects/TestNDK/app/src/main/jni
IDE: Android Studio 0.8.1.
Сначала проверьте, есть ли файлы 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.
просто возникла аналогичная проблема.
Проверьте каталог /data/data/your.package.name/lib
Когда я ls в моем каталоге пакетов в настоящее время отображается:
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, прежде чем повторять попытку. Все было отлично.
Не нужно запускать приложение device.deploy на эмуляторе и просматривать папку
Если у вас есть родной проект с "libXYZ.so", убедитесь, что /system/lib/libXYZ.so не существует на вашем устройстве. Существует мучительное обходное решение: используйте
System.load("/data/data/your.package.name/lib/libXY.so")
вместо System.loadLibrary().
Я только что это произошло, и проблема в том, что устройству просто не хватило места для установки библиотеки. Я удалил некоторые другие приложения, а затем сработал.
Я добавил
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());
}
тогда ошибка исчезла
Имела идентичную проблему. Просто убрал проект, и он сработал. Тайна..
UnsatisfiedLinkerror решается этим. Обновите свой .so файл снова "ndk_build"