Я использую VS-Android для сборки своей программы NDK. У меня есть две библиотеки, «bridge» и «utils», и первая использует вторую. Обе библиотеки успешно скомпилированы, и файлы правильно названы как libbridge.so и libutils.so. Однако, когда я пытаюсь загрузить файлы, я получаю UnsatisfiedLinkError, в которой говорится, что libbridge.so не может получить доступ к liblibutils. Почему он пытается найти liblibutils?
Вот код Java, который я использую для загрузки библиотек:
static
{
System.loadLibrary("utils"); // This loads OK
System.loadLibrary("bridge"); // This is found but causes the UnsatisfiedLinkError
}
Точная ошибка, которую я получаю:
java.lang.UnsatisfiedLinkError: dlopen failed: could not load library "liblibutils"needed by "libbridge.so"; caused by library "liblibutils" not found
Оба библиотечных файла находятся в одной папке:
(projectfolder)/libs/armeabi-v7a/libbridge.so
(projectfolder)/libs/armeabi-v7a/libutils.so
Теперь в Visual Studio соответствующий вывод фазы компоновки libutils.so таков:
-o E:/NDKProject/Debug/armeabi-v7a/libutils.so -lc -lm -llog -lgcc -Wl,-soname,libutils
И соответствующий вывод libbridge.so:
-o E:/NDKProject/Debug/armeabi-v7a/libbridge.so
-LE:/NDKProject/Debug/armeabi-v7a -lutils -lc -lm -llog -lgcc -Wl,-soname,libbridge
Свойства проекта для libutils.so выглядят так:
И для libbridge.so:
Я сбит с толку. Откуда берется дополнительная «lib», когда библиотека моста пытается использовать библиотеку utils? Библиотека utils успешно загружается, как и библиотека мостов, если я не связываю библиотеку utils и не закомментирую все вызовы содержимого библиотеки utils.
До сих пор я пытался изменить имя цели на «utils» вместо «libutils», но это не работает. Я также пытался использовать lib $ (TargetName) в качестве параметра soname, но он тоже не работает.
Я не знаю, почему журнал упоминает liblibutils, но ваш код должен быть изменен, если вы хотите, чтобы он работал на типичной системе Android. Причина в том, что libutils.so
является частью стандартного дистрибутива и находится в /system/lib
, За loadLibrary()
и для родного загрузчика, /system/lib
имеет приоритет над приложением lib каталог, и ваш libutils.so никогда не было возможности загрузить. Следовательно, UnsatisfiedLinkError неизбежно
Используйте более уникальное имя для вашей библиотеки утилит, и загрузчик будет счастлив.
Я нашел причину проблемы. Оказалось, что я ссылался на неправильный файл (неправильную папку), в котором находилась старая версия служебной библиотеки.