Подтвердить что ты не робот

Android ndk UnsatisfiedLinkError при использовании готовой общей библиотеки

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

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

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

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

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

Спасибо заранее,

Ита ​​

4b9b3361

Ответ 1

Обнаружена проблема.

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

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

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

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

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

Приветствия

Ответ 2

  • Вы уверены, что имя функции 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, ...)
    
  • Если вы используете приложение на своем устройстве, Посмотрите, соответствуют ли уровни API и, следовательно, версия sdk для вашей версии Android-версии устройства (уровень API).

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