在X-Cross平台库上使用JsonCpp [英] Using JsonCpp on X-Cross platform library

查看:180
本文介绍了在X-Cross平台库上使用JsonCpp的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在C ++中使用OpenCV和JsonCpp制作了一个库,用于为Android和iOS构建库。



在测试我的库时, JNI文件,但是当我尝试加载库我正在获取


java.lang.UnsatisfiedLinkError:dlopen失败:找不到符号
libXYZ.so引用的_ZN4Json6WriterD2Ev...


这是因为我认为我不是Json库非常好。



我使用的库是这样的: https://github.com/open-source-parsers/jsoncpp



我的Android.mk是:

  LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
$ b b 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)

我不知道如何做。








EDIT 不是NDK Compiling的错误。



即使我编译JsonCpp,我得到


java.lang.UnsatisfiedLinkError:dlopen failed:can not找到由libXYZ.so引用的符号_ZN4Json6WriterD2Ev...


EDIT 我的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



包含$(BUILD_SHARED_LIBRARY)



解决方案

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

  LOCAL_SHARED_LIBRARIES:= libJsoncpp 

之前包含$(BUILD_SHARED_LIBRARY)



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



此外,它使您无法指定 LOCAL_C_INCLUDE 变量中的包含(因为makefile将包括

编辑:为了完整起见,我将您可以指定多个库:

  LOCAL_SHARED_LIBRARIES = libJsoncpp \ 
libOpenCV \
...

,同样适用于 LOCAL_STATIC_LIBRARIES


I'm making a library in C++ with OpenCV and JsonCpp towards building a library for Android and iOS.

On testing my library for Android, I'm making the JNI files but when I try to load the library I'm getting

java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_ZN4Json6WriterD2Ev" referenced by "libXYZ.so"...

and that's because I think I'm not building my Json library very well.

The library that I use is this one: https://github.com/open-source-parsers/jsoncpp

My Android.mk is:

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)

I have no idea of how to do this.

Thank you in advance.


EDIT it's not the NDK Compiling's fault.

Even if I compile the JsonCpp, I get the

java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_ZN4Json6WriterD2Ev" referenced by "libXYZ.so"...

EDIT My 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)

解决方案

You're not linking against Jsoncpp in your makefile. You should add the following line:

LOCAL_SHARED_LIBRARIES := libJsoncpp

before the last include $(BUILD_SHARED_LIBRARY).

You must specify module names for this variable (and its sister LOCAL_STATIC_LIBRARIES), that is, what you specified for the LOCAL_MODULE variable.

Also, that spares you from specifiying the includes in the LOCAL_C_INCLUDE variable (as the makefile will include them directly when specifying the library in the variable I mentioned at the top of my post).

EDIT: For the sake of completeness, I'll add that you can specify multiple libraries like that:

LOCAL_SHARED_LIBRARIES = libJsoncpp \
                         libOpenCV \
                         ...

and the same goes for LOCAL_STATIC_LIBRARIES.

这篇关于在X-Cross平台库上使用JsonCpp的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆