NDK编译C++库,

折腾了一天, 终于把编译问题解决了。

之前使用JNI编译C语言是很随意就过了, 本以为C++也是一样轻松, 没想到上来就被打脸  

用#include 这个头文件, 提示文件不存在, 用find找了一下, 是存在的。后来我把.c改成了.cpp之后, 可以编译通过了。

但是原来的项目是C语言的, 还得想办法用C语言调用C++及C++的第三方库。

我就用C++封装几个C语言的接口。可 参见:C调用C++

当调用第三方的函数时, 又报了一大堆错误, 错误大致如下:error: undefined reference to 'std::basic_string, std::allocator >::assign(char const*)'     

接着google吧。 在http://stackoverflow.com/questions/11665521/ndk-ndk-build-error 这个网址上参考了2楼及3楼。 

嗯, 有效果, 虽然还是没有通过, 但是编译的错误却变成了undefined reference to 'wcstombs'。

又找到了http://bbs.csdn.net/topics/390793521?page=1#post-398836843这个帖子。 错误一模一样, 仔细一看, 都是在用udx,。

让我换64位的机器? 感觉不太靠谱, 接着试吧。

https://groups.google.com/forum/#!msg/android-opencv/MR0iKfsMWYA/rtq2h5Gh8IcJ (貌似得), 上面说平台的版本不够高。然后我把jni目录下的Application.mk文件, 改成了如下:

APP_OPTIM := release
APP_PLATFORM := android-8
APP_STL := gnustl_static
APP_CPPFLAGS += -frtti
APP_CPPFLAGS += -fexceptions
APP_CPPFLAGS += -DANDROID
APP_ABI := armeabi-v7a
 
  

 

问题解决!

但是我怕指定APP_PLATFORM版本, 在其它android机器上会有影响, 所以去掉APP_PLATFORM试了一下, 嗯, 还是不行, 但去掉APP_ABI是可以的。 至此编译问题总算解决了。

Application.mk:

APP_OPTIM := release
APP_PLATFORM := android-8
APP_STL := gnustl_static
APP_CPPFLAGS += -frtti
APP_CPPFLAGS += -fexceptions
APP_CPPFLAGS += -DANDROID
#APP_ABI := armeabi-v7a
 
  

Android.mk:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := com_example_yan_HelloJNI
LOCAL_SRC_FILES := com_example_yan_HelloJNI.c \
    udx_c.cpp

LOCAL_JNI_SHARED_LIBRARIES :=libcom_example_yan_HelloJNI
#LOCAL_LDLIBS := -L/home/dyjun/test/android/jni -lffmpeg
LOCAL_LDLIBS := -L/home/dyjun/jni_udx_test/android/jni/lib/ -lStreamMediaLib -lfudx
LOCAL_WHOLE_STATIC_LIBRARIES := libgnustl_static

#LOCAL_LDLIBS := -L./jni/lib/ -lfudx -lStreamMediaLib

include $(BUILD_SHARED_LIBRARY)
 
  


你可能感兴趣的:(Others)