Невозможно dlopen (libsomething.so) Невозможно загрузить библиотеку: link_image [1995]: не удалось связать libsomething.so
Я пишу проект андроида, который имеет собственный слой, помогающий слою java, и я застреваю в том месте, где, когда я пытаюсь сделать System.loadLibrary, он бросает ошибку, что он не может связать ее.
Я использую Target NDK для создания собственного слоя, а затем с помощью ant для компиляции и создания apk.
При запуске на устройстве я получаю следующую ошибку.
Невозможно dlopen (libsomething.so) Невозможно загрузить библиотеку: link_image [1995]: не удалось связать libsomething.so
Библиотека попадает в apk и распаковывается должным образом. Если я попытаюсь удалить библиотеку вручную, а затем запустите ее, то она фактически выбрасывает эту библиотеку, которая не найдена. Таким образом, он может найти библиотеку, но она выдает эту ошибку, и я не могу узнать, почему эта ошибка наступает.
Пожалуйста, помогите мне.
Ответы
Ответ 1
Сначала найдите местоположение файла .so. и затем можете попробовать:
В следующем примере предполагается, что расположение общей библиотеки:
/data/data/my.package/lib/libmysharedlibrary.so
try {
//System.loadLibrary("mysharedlibrary");
System.load("/data/data/my.package/lib/libmysharedlibrary.so");
} catch (UnsatisfiedLinkError use) {
Log.e("JNI", "WARNING: Could not load libmysharedlibrary.so");
}
Ответ 2
У меня есть ловушка в том же вопросе. наконец, я получил ответ из этой статьи:
http://mpigulski.blogspot.com/2010/09/debugging-dlopen-unsatisfiedlinkerror.html
использовать
arm-linux-androideabi-readelf.exe -d libs/armeabi/libmy.so
Затем найденная НЕОБХОДИМА Общая библиотека в неправильном имени.
Ответ 3
Вы также можете найти эту ошибку, используя метод System.load(String pathName) и просто передавая имя_бассы, а не полный путь к библиотеке.
Разрешение: используйте метод System.loadLibrary(String libName) и теперь передайте имя библиотеки.
Ответ 4
Иногда (большую часть времени!) для библиотеки вам нужны другие библиотеки, упомянутые @musefan. и вы можете перечислить их, выполнив readelf -d libs/armeabi/libmy.so. Однако здесь есть уловка: поскольку у Android нет никакого механизма для управления версией библиотеки (например, в обычном Linux у вас есть liblzma.so.1, liblzma.so.2 и т.д.), Вам нужна библиотека (liblzma.so) НО не имеет каких-либо символов, импортированных вашей библиотекой. Вот живой пример: вы используете
android::ZipFileRO::getEntryInfo
функция находится в libutils.so. Вся версия библиотеки имеет эту функцию, однако PROTOTYPE функции была изменена в конце 2010 года, поэтому вы создали приложение для 4.0.4. NDK не будет работать на устройствах FroYo или устройствах с одинаковым симптомом: dlopen
не может загружаться библиотека. Вот рецепт, как обнаружить такие случаи: вам нужна папка os/system/lib содержимого на вашем ПК. Это может быть папка, сбрасываемая с вашего устройства, если вы стороннее приложение разработано или построено, если вы разработчик платформы. затем выполните команду
arm-linux-gnueabi-ld -rpath-link /path/to/system/lib ./lib_mylib.so
и вы увидите что-то ложь это в случае ошибки
lib_mylib.so: undefined reference to
android:: ZipFileRO:: getEntryInfo (void *, int *, long *, long *, long *, long *, long *) const``