Использование 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,

Другие вопросы по тегам