【问题标题】:Using JsonCpp on X-Cross platform library在 X-Cross 平台库上使用 JsonCpp
【发布时间】:2014-11-21 13:59:44
【问题描述】:

我正在使用 OpenCV 和 JsonCpp 在 C++ 中创建一个库,以构建适用于 Android 和 iOS 的库。

在测试我的 Android 库时,我正在制作 JNI 文件,但是当我尝试加载库时,我得到了

java.lang.UnsatisfiedLinkError: dlopen failed: 找不到符号 “libXYZ.so”引用的“_ZN4Json6WriterD2Ev”...

那是因为我认为我没有很好地构建我的 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: 找不到“libXYZ.so”引用的符号“_ZN4Json6WriterD2Ev”...

编辑我的 jsoncpp/Android.mk :

LOCAL_PATH := $(call my-dir)

包括 $(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)

【问题讨论】:

  • 我看不到你在 makefile 中与 jsoncpp 库的链接在哪里。
  • 对不起,我在后面添加...我正在编辑它
  • 你的 jsoncpp 的 android.mk 的内容是什么? :)
  • 哈哈谢谢@JBL,补充了:)

标签: android c++ opencv android-ndk jsoncpp


【解决方案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 也是如此。

【讨论】:

  • 你是对的......但我得到了一个“java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "ZN2cv3Mat8copySizeERKS0”引用的“libXYZ.so” “...”,它似乎就像一个 cv::Mat.copy(Size())... 是同样的问题吗? (非常感谢)
  • 嗯...你在哪里与 OpenCV 链接? :D(提示:我在您发布的 makefile 中没有看到它)
  • 哦,再次感谢:LOCAL_SHARED_LIBRARIES := libJsoncpp libopencv_java 我想我得再补充一些 :)
  • 我正在构建相同的 jsoncpp 源代码,但出现以下错误,检查了这么多线程,所以没有得到正确的解决方案。请检查错误并建议。Android NDK: jni/jsnlib/Android.mk:jsnlib: LOCAL_MODULE_FILENAME 不应包含文件扩展名 Android NDK: jni/jsnlib/Android.mk:jsnlib: LOCAL_MODULE_FILENAME 不得包含文件扩展名
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 2011-07-17
相关资源
最近更新 更多