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

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

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

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

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

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

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


person Puneet    schedule 18.01.2011    source источник


Ответы (4)


Сначала найдите расположение файла .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");
}
person TheCottonSilk    schedule 18.01.2011
comment
Как я уже сказал, библиотека находится в нужном месте. Я получаю вывод журнала, в котором говорится, что он пытается загрузить библиотеку, но при фактической попытке загрузки он дает мне эту ошибку. Тем не менее, попробуем и это изменение. Странно, этот же apk работает на одном устройстве, но не на другом. И я совершенно не понимаю, почему такое поведение происходит. - person Puneet; 18.01.2011
comment
Можете ли вы обновить путь к файлу библиотеки на обоих устройствах? - person TheCottonSilk; 18.01.2011
comment
Он упакован в apk, поэтому автоматически распаковывается при установке в тот же каталог. то есть /data/data/package/lib/libsomething.so - person Puneet; 18.01.2011
comment
Если пути правильные на обоих устройствах, то это действительно странно. Можете ли вы вставить соответствующую часть (детали исключения: 6/7 строк) вывода logcat. - person TheCottonSilk; 18.01.2011
comment
Я узнал проблему. Моя библиотека пыталась внутренне связать с какой-то другой общей библиотекой, и эта другая общая библиотека отсутствовала на устройстве, выдавая ошибки связи, но присутствовала на устройстве, которое работало нормально. :) В Logcat не было понятно, почему это происходит, поэтому я был сбит с толку, но после некоторого сравнения кода и некоторых проб и ошибок выяснилось, что это так. Спасибо за помощь. - person Puneet; 18.01.2011
comment
Хорошо, что вы нашли свою проблему и смогли ее решить. Я думаю, если бы вы потратили некоторое время на анализ логкэта, вы могли бы понять эти вещи намного раньше. Logcat очень четко говорит, что вы просили связать и смог ли он это найти или возникла ошибка UnsatisfiedLinkError. - person TheCottonSilk; 18.01.2011

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

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

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

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

person g00g1e    schedule 21.12.2011
comment
Я борюсь с тем, что кажется той же проблемой. У меня в списке НЕОБХОДИМО 6, но как узнать, что присутствует в устройстве? Какие-то устройства работают, какие-то нет. - person SpacemanScott; 17.05.2018

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

person mishmashru    schedule 01.02.2013

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

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

person Community    schedule 22.11.2012