VS-Android выдает "неправильные" имена при связывании с общими библиотеками

Я использую 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 выглядят так:

  • Целевое имя: libutils
  • Установка 'soname': $(TargetName)

И для libbridge.so:

  • Целевое имя: libbridge
  • Установка 'soname': $(TargetName)
  • Дополнительные зависимости: -lutils

Я сбит с толку. Откуда берется дополнительная "lib", когда библиотека моста пытается использовать библиотеку utils? Библиотека utils загружается успешно, как и библиотека мостов, если я не связываю библиотеку utils и не закомментирую все вызовы содержимого библиотеки utils.

До сих пор я пытался изменить имя цели на "utils" вместо "libutils", но это не работает. Я также пытался использовать lib$(TargetName) в качестве параметра soname, но он тоже не работает.

2 ответа

Решение

Я нашел причину проблемы. Оказалось, что я ссылался на неправильный файл (неправильную папку), в котором находилась старая версия библиотеки утилит.

Я не знаю, почему в журнале упоминается liblibutils, но ваш код должен быть изменен, если вы хотите, чтобы он работал на типичной системе Android. Причина в том, что libutils.so является частью стандартного дистрибутива и находится в /system/lib, За loadLibrary() и для родного загрузчика, /system/lib имеет приоритет над специфичным для приложения каталогом lib, и ваш libutils.so никогда не имел возможности загрузить. Следовательно, UnsatisfiedLinkError неизбежна.

Используйте более уникальное имя для вашей библиотеки утилит, и загрузчик будет счастлив.

Другие вопросы по тегам