android ndk UnsatisfiedLinkError при использовании готовой общей библиотеки - PullRequest
12 голосов
/ 14 марта 2011

Я пытаюсь создать общую библиотеку, которая ссылается на другую общую библиотеку.

Вот мой основной модуль Android.mk:

TOP_LOCAL_PATH := $(call my-dir)
include $(call all-subdir-makefiles)

LOCAL_PATH := $(TOP_LOCAL_PATH)

include $(CLEAR_VARS)

LOCAL_CPP_EXTENSION := cpp


LOCAL_C_INCLUDES := $(LOCAL_PATH)/include/ $(LOCAL_PATH)/lib/include
LOCAL_MODULE    := SightCore-jni
LOCAL_SRC_FILES := SightDemo.cpp SightCore-jni.cpp
LOCAL_SHARED_LIBRARIES := SightAPI
LOCAL_LDLIBS = -llog 

include $(BUILD_SHARED_LIBRARY)

У меня также есть встроенная общая библиотека в каталоге ./lib с собственным файлом Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := SightAPI
LOCAL_SRC_FILES := libSightAPI.so
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include

include $(PREBUILT_SHARED_LIBRARY)

Исходный файл SightCore-jni.cpp является интерфейсом jni к общей библиотеке и загружается с помощью команды

System.loadLibrary("SightCore-jni");  

В процессе сборки ndk я получаю без компиляции или связывания ошибок.Когда я пытаюсь запустить приложение и получить доступ к одному из собственных методов, я получаю UnsatsfiedLinkError.Я заметил, что если отключить ссылки на SightAPI в моем коде jni и добавить опечатку в строку LOCAL_STATIC_LIBRARIES: = SightAPI, сборка будет успешной, и в ней не будет UnsatisfiedLinkError .
Это означает, что jniу меня хороший код (на самом деле я уверен, что он в порядке ...)

Итак, наблюдение выглядит следующим образом:
Если я скомпилирую общую библиотеку сготовая общая библиотека Я получаю поврежденный .so файл.

Если я скомпилирую тот же проект ndk без ссылки на предварительно собранную общую библиотеку , то не будет проблем загрузка общей библиотеки со стороны java.

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

Заранее спасибо,

Ита

Ответы [ 3 ]

13 голосов
/ 20 марта 2011

Нашел проблему.

Очевидно, система компоновки ndk не загружает автоматически ссылки на общие библиотеки , даже если они объявлены в вашем Android.mk.

Мне пришлось позвонить на System.loadLibrary(SightAPI) & System.loadLibrary("SightCore-jni"), чтобы решить эту проблему. Я ожидал, что единственной библиотекой для загрузки была бы основная библиотека SightCore-jni .

Ну, я думаю, что мораль в том, что если ты хочешь что-то сделать, сделай это сам:)

+ 1 к Рою Самуэлю за его усилия и правильные инстинкты.

Надеюсь, это кому-нибудь поможет.

Приветствия

4 голосов
/ 18 марта 2011
  1. Вы убедились, что имя функции cpp, которое вы хотите использовать поверх JNI, соответствует имени пакета класса Java-оболочки, в котором присутствует System.loadLibrary("SightCore-jni");?

    Например, если вы хотите использовать функцию C, myFunction на уровне java, и предположить, что ваш класс-оболочка JNI находится в пакете com.my.package.sightcore, тогда имя вашей функции кода C должно быть таким:

    JNIEXPORT  JNICALL Java_com_my_package_sightcore_myFunction(JNIEnv * env, jobject thiz, ...)
    
  2. Если вы запускаете свое приложение на своем устройстве, посмотрите, соответствуют ли уровни API, и, следовательно, версия SDK соответствует версии Android вашего устройства (уровень API).

Надеюсь, это поможет.Дайте мне знать, если вам нужны дополнительные разъяснения ...

0 голосов
/ 15 февраля 2019

Это случилось со мной, и решение для меня состояло в том, чтобы убедиться, что я включил правильный файл libgnustl_shared.so, а не libc++_shared.so после того, как я переключил компиляторы. Поэтому, просто убедившись, что один из этих файлов является правильным для вашей сборки, и убедившись, что он был обновлен до последней версии, эта проблема больше не должна возникать.

...