Невозможно dlopen (libsomething.so) Невозможно загрузить библиотеку: link_image [1995]: не удалось связать libsomething.so - PullRequest
15 голосов
/ 18 января 2011

Я пишу проект Android, в котором слой Native помогает java-слою, и я застрял в месте, где при попытке создания System.loadLibrary выдается ошибка, из-за которой он не может связать его.

Я использую целевой NDK для создания нативного слоя, а затем использую ant для компиляции и создания apk.

При запуске на устройстве я получаю следующую ошибку.

Невозможно dlopen (libsomething.so) Невозможно загрузить библиотеку: link_image [1995]: не удалось связать libsomething.so

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

Пожалуйста, помогите мне.

Ответы [ 4 ]

11 голосов
/ 18 января 2011

Сначала найдите местоположение .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");
}
10 голосов
/ 21 декабря 2011

У меня ловушка в том же вопросе. наконец я получил ответ из этой статьи: http://mpigulski.blogspot.com/2010/09/debugging-dlopen-unsatisfiedlinkerror.html

использовать

arm-linux-androideabi-readelf.exe  -d libs/armeabi/libmy.so

Затем нашел нужную общую библиотеку с неправильным именем.

4 голосов
/ 01 февраля 2013

Иногда (в большинстве случаев!) Вашей библиотеке требуются другие библиотеки, упомянутые @musefan. и вы можете перечислить их, выполнив команду readelf -d libs / armeabi / libmy.so. Однако здесь есть одна загвоздка: поскольку Android не имеет какого-либо механизма для управления версией библиотеки (как в обычном Linux у вас есть liblzma.so.1, liblzma.so.2 и т. Д.), Библиотека, в которой вы нуждаетесь, есть (liblzma.so) НО не имеет символов, импортированных вашей библиотекой. Вот живой пример: вы используете android::ZipFileRO::getEntryInfo функция находится в libutils.so. Эта версия есть во всех версиях библиотеки, однако ПРОТОТИП этой функции был изменен в конце 2010 года, поэтому приложение, созданное для 4.0.4, NDK не будет работать на устройствах FroYo или на устройствах GB с такой же симптоматикой: 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'`

3 голосов
/ 22 ноября 2012

Вы также можете найти эту ошибку при использовании System.load (String pathName) метода и просто передать libraryName вместо полного пути к библиотеке.

Разрешение: используйте System.loadLibrary (String libName) метод и теперь передайте libraryName.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...