Использование JsonCpp в библиотеке платформы X-Cross
Я делаю библиотеку на C++ с OpenCV и JsonCpp для создания библиотеки для Android и iOS.
При тестировании моей библиотеки для Android я делаю файлы JNI, но когда я пытаюсь загрузить библиотеку, я получаю
java.lang.UnsatisfiedLinkError: сбой dlopen: невозможно найти символ "_ZN4Json6WriterD2Ev", на который ссылается "libXYZ.so"...
и это потому, что я думаю, что я не очень хорошо строю свою библиотеку Json.
Вот библиотека, которую я использую: https://github.com/open-source-parsers/jsoncpp
Мой Android.mk это:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
OPENCV_CAMERA_MODULES:=off
OPENCV_INSTALL_MODULES:=on
include $(LOCAL_PATH)/jsoncpp/Android.mk
include /Users/localmac/Desktop/AndroidDevelopment/OpenCV-2.4.9-android-sdk/sdk/native/jni/OpenCV.mk
OPENCV_LIB_TYPE:=SHARED
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_C_INCLUDES += /Users/localmac/mylibrary/OpenCVtry/
LOCAL_C_INCLUDES += /Users/localmac/Desktop/RD/OpenCVtry/Libraries/jsoncpp-master/include
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
LOCAL_MODULE := libXYZ
LOCAL_SRC_FILES := androidClass.cpp main.cpp utils.cpp
LOCAL_LDLIBS += -llog -ldl
include $(BUILD_SHARED_LIBRARY)
Я понятия не имею, как это сделать.
Заранее спасибо.
РЕДАКТИРОВАТЬ это не ошибка компиляции NDK.
Даже если я скомпилирую JsonCpp, я получу
java.lang.UnsatisfiedLinkError: сбой dlopen: невозможно найти символ "_ZN4Json6WriterD2Ev", на который ссылается "libXYZ.so"...
РЕДАКТИРОВАТЬ My jsoncpp / Android.mk:
LOCAL_PATH: = $ (позвоните в мой каталог)
включает $ (CLEAR_VARS)
LOCAL_CPP_EXTENSION: =.cpp LOCAL_MODULE: = libJsoncpp
LOCAL_C_INCLUDES: = $ (LOCAL_PATH) / jsoncpp / include
LOCAL_SRC_FILES: = src / lib_json / json_reader.cpp \ src / lib_json / json_value.cpp \ src / lib_json / json_writer.cpp
включает $(BUILD_SHARED_LIBRARY)
1 ответ
Вы не ссылаетесь на Jsoncpp в вашем make-файле. Вы должны добавить следующую строку:
LOCAL_SHARED_LIBRARIES := libJsoncpp
до последнего include $(BUILD_SHARED_LIBRARY)
,
Вы должны указать имена модулей для этой переменной (и ее сестры LOCAL_STATIC_LIBRARIES
), то есть то, что вы указали для LOCAL_MODULE
переменная.
Кроме того, это избавляет вас от указания включения в LOCAL_C_INCLUDE
переменная (поскольку make-файл будет включать их непосредственно при указании библиотеки в переменной, которую я упомянул в верхней части моего поста).
РЕДАКТИРОВАТЬ: Ради полноты, я добавлю, что вы можете указать несколько библиотек, как это:
LOCAL_SHARED_LIBRARIES = libJsoncpp \
libOpenCV \
...
и то же самое касается LOCAL_STATIC_LIBRARIES
,