2014-09-26 100 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