使用NDK编译并运行C++11的Command line命令行程序

来源:互联网 发布:linux kill -9用法 编辑:程序博客网 时间:2021/09/25 16:30

用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

C++11APP_STL := gnustl_static





0 0
原创粉丝点击