Java — 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, но он тоже не работает.

0

Решение

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

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

0

Другие решения

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

0

По вопросам рекламы [email protected]