一、背景介绍
项目开发中,假设有一个 C++ 的 SDK,需要运行在 Android 系统上,可能我们需要先写一个测试程序来测试这个 SDK 的接口是否能够在手机上正常执行,可是写一个 Android 程序(还需要写JNI),就比较复杂了。那么比较快的做法是直接写一个可执行程序在手机上运行,这样你不仅不用写任何界面,甚至连 Android 和 JNI 都不用懂就可以测试了。
这样做的好处还有一个,就是完全脱离了页面,对于测试 SDK 接口内存很方便。
二、如何实现
- 首先你需要下载 NDK 的开发包
- 使用 NDK 编译生成在 Android 系统上可运行的执行程序
- 把编译好的可执行程序丢到手机目录下,然后直接执行就可以了。
三、怎么做
我们就以 HelloWorld 为例来实现吧。
1. 首先编写一个 HelloWorld.cpp 如下:
#include <iostream> using namespace std; int main() { cout << "Hello World" << endl; return 0; }
2. 你们电脑需要装好 arm-linux-androideabi-g++ 的环境
这个需要你先将 NDK 的工具链生成并配置到环境变量中去。
关于如何配置 NDK 工具链的环境,可以参考这篇博客:NDK工具链的生成和配置
3. 执行如下语句
arm-linux-androideabi-g++ -std=c++11 -pie -fPIE -o HelloWorld HelloWorld.cpp
解释:
-std=c++11
指定使用 C++11-pie
不配置的话会出现如下错误:
“HelloWorld”: error: Android 5.0 and later only support position-independent executables (-fPIE).-o
是编译HelloWorld
是指定生成的可执行文件名,随便取都行HelloWorld.cpp
是需要编译的源代码
4. 将生成的可执行程序 push 到手机中并执行
5. 当然我们也可以写一个 .sh 来一键化操作,例如
arm-linux-androideabi-g++ -std=c++11 -pie -fPIE -o HelloWorld HelloWorld.cpp adb root adb remount adb push HelloWorld /system/bin
四、扩展
当然实际应用中我们的测试程序肯定不会这么简单,他还会包含很多其他的头文件、静态库动态库等等,所以我们的编译语句可能是如下这样的:
arm-linux-androideabi-g++ -I include -std=c++11 -pie -fPIE -o UnitTest test.cpp lib/xxx.so lib/xxx.so lib/xxx.a ...