从NDK r10e提取交叉编译链过程
前言
今年公司需求把嵌入式c/c++源码移植到Android系统里面,需要获取交叉编译器,经过一番折腾,终于完成,记录一下。
系统信息:ubuntu 1604
板子信息:RK3288
安卓版本:5.1.1
1.下载ndk源码。
根据手上英码的开发板信息,模块是RK3288,Android version是5.1.1。 我们需要用4.8的编译器,Android API等级是21,需要下载ndk版本是10,9及以下的ndk版本没有Android-21的platform,11及以上的ndk版本,没有4.8的编译器,只有4.9编译器。
https://developer.android.google.cn/ndk/downloads/older_releases
开始进入会有条款询问,同意即可。
拉到最下面可以看到ndk r10e 选择下载:android-ndk-r10e-linux-x86_64.zip既可。文件有1G多,也可以用我下载好的源码包。
链接: https://pan.baidu.com/s/1mEU1tz0tA62_xV_VCpv5TQ 提取码: vu62
2.执行脚本导出编译器。
解压zip包(没有zip工具的自行下载),uzip android-ndk-r10e-linux-x86_64.zip
然后进入ndk顶层目录,cd android-ndk-r10e
执行脚本指定目录生成编译器包。
./build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.8 --platform=android-21 --abis=armeabi-v7a --package-dir=/work/huangriwang/
没有报错即可。就可以在/work/huangriwang/看到生成的编译器的压缩包
根据安卓板子的基本信息,我们需要指定编译链的参数。
--toolchain= 指定编译版本,4.8,英码的屏使用的编译器版本是4.8.
--platform= 指定安卓 API等级,英码用的是安卓5.1,根据查到的对应关系,应该用android-22 ,但是ndk r10e 没有这个platform,经过测试用安卓5.0的也可以用,所以这里使用的是android-21.
--abis= 指定arm架构,RK3288采用的是armV7a,这里指定armeabi-v7a。
--package-dir= 指定编译器压缩包存放路径,默认是/tmp/ndk-用户名/这个目录,建议修改一下,这个是临时目录重启后文件就没有了。
3.安装编译器(拷贝和添加环境变量)
用tar命令解压生成的压缩包,再把相应的路径添加的环境变量PATH即可。
4.测试
能看到编译器信息。
可以用ndk里面的测试代码进行测试编译器是否正常。
/work/huangriwang/android-ndk-r10e/tests/standalone
basic-c-compile c代码的helloworld
basic-cxx-compile c++代码的helloworld
例如:
注意,安卓4.4以后需要用PIE格式编译。需要加编译的时候需要加-pie -fPIE 这两个参数
查看文件信息可以看到shared object 就可以了。C++类似,编译器换安卓的g++即可。
编译好的文件可以用个adb push到安卓里面
拷贝文件命令
adb root 切换用户,拷贝文件需要root用户,默认是shell用户。
adb remount 重新挂载,默认是只读系统,重新挂载可以变为读写。
adb push e:\a.out /data/local/ 执行就可以把e盘的a.out文件放到安卓的/data/local/
路径可以改,但是不能放到SD卡目录,这个目录是不能执行的
adb shell 进入shell终端,里面操作就是Linux的操作。
进入/data/local/,因为push进来的文件是没有执行权限的。
Chmod 777 a.out 开放权限既可。
./a.out 就可以看到输出helloworld。
到这里,从NDK源码包提取的编译链,并且测试成功了。Goodluck。