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.
Пожалуйста, помогите мне, если сможете.
Спасибо заранее,
Ита
Ответы
Ответ 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).
Надеюсь, это поможет. Дайте мне знать, если вам нужны дополнительные разъяснения...