使用NDK编译并运行C++11的Command line命令行程序
来源:互联网 发布:linux kill -9用法 编辑:程序博客网 时间:2024/04/26 16:52
用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
- 使用NDK编译并运行C++11的Command line命令行程序
- 编译、运行脚本和Command Line命令行参数设置
- 如何从Terminal Command Line编译并运行Scope
- TexturePacker命令行使用(command line)
- ndk编译android上运行的c程序
- NDK编译Android上运行的C可执行程序
- Android 使用NDK编译二进制文件并运行
- 使用命令行编译并运行应用程序
- (二)NS3如何编译、运行脚本和 Command Line命令行参数设置
- 命令行编译运行Objective-C程序
- windows命令行下编译、运行c程序
- 如何从windows的command line运行Qt程序
- Windows 下使用 GNUstep 编译并运行 Objective-C 程序
- Windows 下使用 GNUstep 编译并运行 Objective-C 程序
- Windows 下使用 GNUstep 编译并运行 Objective-C 程序
- Windows 下使用 GNUstep 编译并运行 Objective-C 程序
- 使用命令行对java程序的编译运行和打包
- 使用命令行编译运行指定了包的Java程序
- 子进程与父进程
- Hessian
- Arrow Function in ES6:=>
- FLV文件格式解析
- linux 获取线程号
- 使用NDK编译并运行C++11的Command line命令行程序
- 软件开发工程师面试题
- 邻接矩阵
- 谈谈性能测试分类
- Python | 递归
- 问题:flush()与ob_flush()函数????
- 一触即发 App启动优化最佳实践
- 数据挖掘面试--火烈鸟网络
- ssh的增删该查