Я пишу проект Android, в котором есть собственный слой, помогающий слою java, и я застрял в месте, где, когда я пытаюсь сделать System.loadLibrary, выдается ошибка, что он не может связать его.
Я использую целевой NDK для создания собственного слоя, а затем использую ant для компиляции и создания apk.
При запуске на устройстве я получаю следующую ошибку.
Невозможно dlopen(libsomething.so) Не удается загрузить библиотеку: link_image[1995]: не удалось связать libsomething.so
Библиотека собирается в apk и правильно распаковывается. Если я попытаюсь удалить библиотеку вручную, а затем запустить ее, она фактически выдает эту библиотеку, которая не найдена. Итак, он может найти библиотеку, но выдает эту ошибку, и я не могу понять, почему эта ошибка возникает.
Пожалуйста помогите.
Ответ 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");
}
Ответ 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' `