多语言展示
当前在线:845今日阅读:176今日分享:34

如何在Eclipse中配置NDK

在Eclipse中实现了NDK的配置后,就可以直接将C++程序编译成相关库,以供JNI层调用
工具/原料
1

Eclipse, Mac版本的NDK---android-ndk-r10

2

这里以引用opencv的动态库为例

方法/步骤
1

下载Mac平台的NDK版本,这里下载的是android-ndk-r10

2

例如在Eclipse的JNI目录中引入opencv库, 配置如下,绿色方框是最终生成动态库的目录:

3

为JNI编译Android.mk和Application.mk文件

4

Java层如何加载opencv的动态库注:Java层在加载opencv库的时候,发现有依赖关系,该依赖关系的顺序已经调好了,否则会提示XX库找不到

Application.mk中,该值APP_STL的说明
1

1.在jni目录下新建Application.mk; 加入APP_STL :=  stlport_static  右边的值还可以换成下面几个:    system - 使用默认最小的C++运行库,这样生成的应用体积小,内存占用小                  ,但部分功能将无法支持    stlport_static - 使用STLport作为静态库    stlport_shared - STLport 作为动态库,这个可能产生兼容性和部分低版本的                              Android固件,目前不推荐使用。     gnustl_static  - 使用 GNU libstdc++ 作为静态库     默认情况下STLPORT是不支持C++异常处理和RTTI,所以不要出现-fexceptions 或-frtti ,如果真的需要,可以使用gnustl_static来支持标准C++的特性,但生成的文件体积会偏大,运行效率会低一些。     支持C++异常处理,在Application.mk中加入LOCAL_CPPFLAGS += -fexceptions这句,同理支持RTTI,则加入LOCAL_CPPFLAGS += -frtti。    强制重新编译STLPort ,在Application.mk中加入STLPORT_FORCE_REBUILD := true 可以强制重新编译STLPort源码,由于一些原因可能自己需要修改下STLPort库,一般普通的开发者无需使用此项

2

2.在要使用STL的cpp文件中包含相关的头文件,并且使用using namespace std;

3

补充:1.     APP_STL的取值:2.     system(default)系统默认的C++运行库3.     stlport_static以静态链接方式使用的sttport版本的STL4.     stlport_shared以动态链接方式使用的sttport版本的STL5.     gnustl_static以静态链接方式使用的gnustl版本的STL6.     gnustl_shared以动态链接方式使用的gnustl版本的STL7.     gabi++_static以静态链接方式使用的gabi++8.     gabi++_shared以动态链接方式使用的gabi++9.     c++_static以静态链接方式使用的LLVM libc++10.  c++_shared以动态链接方式使用的LLVM libc++11.  就目前的情况,LLVM的支持要优于GNU,所以推荐使用“c++_static”12.  由于Android系统的碎片化,各个版本的libgnustl_share.so不一致,就导         致崩溃或者运行异常问题鉴于gnustl_share存在诸多不稳定问题,所以尽量       采用gnustl_static替代gnustl_share。13.  使用gnustl_static,尽量避免使用gnustl_share。此外gnustl将逐步废弃!

注意事项
1

说明:如果遇到该错误 undefined reference to '__atomic_fetch_add_4',请在Android.mk文件引入该库: LOCAL_LDLIBS += -latomic

2

说明:在window系统中,Android工程不能包含中文路径,否则编译jni目录里面的文件时,找不到目标路径,编译不出.so文件的.

推荐信息