2014-09-26 103 views
1

我正在C++中使用OpenCV和JsonCpp构建一个库,为Android和iOS构建一个库。在X-Cross平台库上使用JsonCpp

在测试我的库为Android,我正在做的JNI文件,但是当我尝试加载库我越来越

java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_ZN4Json6WriterD2Ev" referenced by "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 failed: cannot locate symbol "_ZN4Json6WriterD2Ev" referenced by "libXYZ.so"...

编辑我jsoncpp/Android.mk:

LOCAL_PATH := $(call my-dir)

include $(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

include $(BUILD_SHARED_LIBRARY)

+0

我没有看到你的makefile中的jsoncpp lib链接在哪里。 – JBL 2014-09-26 14:41:02

+0

对不起,我加了......我正在编辑它 – 2014-09-26 14:41:36

+0

你的jsoncpp的'android.mk'的内容是什么? :) – JBL 2014-09-26 14:42:43

回答

1

你不是在你的makefile链接对Jsoncpp。您应该添加以下行:

LOCAL_SHARED_LIBRARIES := libJsoncpp 

在最后include $(BUILD_SHARED_LIBRARY)之前。

您必须为此变量(及其姐妹LOCAL_STATIC_LIBRARIES)指定模块名称,即您为LOCAL_MODULE变量指定的内容。

此外,您不必指定LOCAL_C_INCLUDE变量中的包含(因为makefile会在我在文章顶部提到的变量中指定库时直接包含它们)。

编辑:为了完整起见,我会补充一点,你可以指定多个库这样的:

LOCAL_SHARED_LIBRARIES = libJsoncpp \ 
         libOpenCV \ 
         ... 

和同样为LOCAL_STATIC_LIBRARIES

+0

你是对的...但相反,我得到一个“java.lang.UnsatisfiedLinkError:dlopen失败:找不到符号”_ZN2cv3Mat8copySizeERKS0_“引用”libXYZ.so“。 ..“,似乎它就像一个cv :: Mat.copy(Size())...是同样的问题? (非常感谢) – 2014-09-26 15:00:29

+1

那么...你在哪里与OpenCV链接?:d(提示:我没有看到它在您发布的makefile文件)再次 – JBL 2014-09-26 15:01:13

+0

哦感谢:'LOCAL_SHARED_LIBRARIES:= libJsoncpp libopencv_java'我想我会添加一些更:) – 2014-09-26 15:11:21