Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: PuneetОтветов: 4

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

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

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

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

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

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

androidandroid-ndk

Ответы

Ответ 1 · рейтинг 11 · TheCottonSilk

Сначала найдите расположение файла .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 · рейтинг 10 · g00g1e

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

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

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

Затем нашел НЕОБХОДИМУЮ общую библиотеку с неправильным именем.

Ответ 3 · рейтинг 5 · mishmashru

Иногда (в большинстве случаев!) вашей библиотеке требуются другие библиотеки, как упоминал @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 toandroid::ZipFileRO::getEntryInfo(void*, int*, long*, long*, long*, long*, long*) const' `

Ответ 4 · рейтинг 3 · Community

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы