用C++11写了一个并发的类,使用了lock-free的算法。需要在跨平台(PC、android)执行一个测试程序,测试在不同CPU上是否稳定。
在android上,涉及到如何使用NDK编译和执行命令行程序以及如何使用NDK编译支持C++11的程序这两个问题。
以下使用android-ndk-r10d,在windows上执行。
一、如何使用NDK编译和执行命令行程序
在NDK的sample中有例子,比如test-libstdc++。
关键点有:
1、在myproject目录下建立jni目录
2、jni目录建立Application.mk和Android.mk两个编译配置文件
2.1 在android.mk 设置编译目标是可执行文件:
include $(BUILD_EXECUTABLE)
2.2 注意按照步骤3执行ndk-build时,android.mk 中的LOCAL_PATH是包含了jni路径,而在编译代码文件时,也会带jni。所以:
LOCAL_PATH := $(call my-dir)
#MY_SRC_PATH 不能写成$(LOCAL_PATH)../../../src,否则会提示找不到jni/jni/.....的文件了
MY_SRC_PATH := ../../../src
#但是MY_INCLUDE_PATH还是要带LOCAL_PATH,否则找不到头文件。
MY_INCLUDE_PATH := $(LOCAL_PATH)/../../../include
3、在myproject目录执行ndk-build,生成可执行文件
4、使用adb push 把生成的可执行文件拷贝到手机上
5、使用adb shell 登录到手机上,chmod修改文件的属性,加上“执行”权限
6、运行文件。
二、如何使用NDK编译C++11的应用程序
NDK提供多个toolchain和C++的支持库。不同版本支持的特性不同。
1、toolchain
先说toolchain,首先不同的cpu有不同的toolchain,比如arm的toolchain,x86的toolchain。
在同一个平台,根据不同的编译器可以继续细分,比如arm的toolchain又分成使用gcc来编译或者使用Clang来编译。
同一类编译器还有不同的版本,比如arm gcc的编译器又有4.6 4.8等不同的版本。
所以,要支持C++11,首先要选择一个支持C++11语法的编译器
2、关于运行时库
C++11包括很多标准库,比如<thread>,<atomic>。NDK提供了很多个C++的运行库,不同运行库支持的功能不同。
默认使用的运行时库叫system,功能很有效。除system之外,还有stlport,gabi++,gnu stl,llvm libc++等不同版本。
同一个版本的库,比如gnu stl,又可以分成静态库,动态库等。
所以,还要根据应用需求,选择合适的运行时库
3、配置Application.mk
选择支持的编译器版本,选择支持的运行时库。这两个选项都在Application.mk中。比如:
#选择toolchain。使用GCC的4.8版本,4.9应该也是可以的,但是4.6不支持thread等。clang3.4和clang3.5也是可以的
NDK_TOOLCHAIN_VERSION := 4.8
#选择运行库。使用libstdC++的静态库。使用gnu stl的库gnustl_static/
gnustl_shared,或者使用llvm的libC++,
c++_static/
c++_shared,都是可以的。但是stlport不支持C++11
APP_STL := gnustl_staticC++11