博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android独立交叉编译环境搭建
阅读量:6587 次
发布时间:2019-06-24

本文共 2216 字,大约阅读时间需要 7 分钟。

我们经常需将一些C/C++源码编译成本地二进制,直接在android的linux内核上运行,这是就需要进行交叉编译。由于Android的运行环境核普通Linux又区别,所以常规方式针对ARM进行交叉编译得到的二进制,无法直接运行在Android环境上。我们需要机遇Android环境进行交叉编译,这时有两种方式:一种是编写Android.mk,在安卓源码结构下依靠安卓的编译系统搞定;另一种方式是脱离android源码体系,利用独立的android交叉编译工具链,并适当修改目标代码的Makefile(必要时还要修改源码)完成交叉编译。第一种方式适用于编译目标源码结构简单的情况;当目标源码的Makefile组织非常复杂的时候,第二种方式则是更好的选择。本文介绍第二种方式,即搭建Android独立交叉编译环境,编译出可以在Android(默认基于ARM64)上运行的二进制(ELF)程序。

 

1、NDK下载

本文以宿主机系统MacOS为例,所以下载MacOSX版本的ndk包

 

2、利用NDK安装android交叉编译工具链

解压NDK后,进入buildtools目录
NickPro:android-ndk-r14b nickyang$ cd build/tools/
NickPro:tools nickyang$ pwd
/Users/nickyang/android-ndk-r14b/build/tools
 
NDK提供了两个脚步用于一键化构建gcc工具链:
make-standalone-toolchain.sh
make_standalone_toolchain.py
 
我们使用py版本的,按照官方说明,sh版本将被淘汰
./make_standalone_toolchain.py --arch arm64 --api 24 --unified-headers --install-dir ~/android-build
 
参数解释:
—arch : 交叉编译目标平台
--unified-header: 使用libc头文件,相关解释可参考:
Https://android.googlesource.com/platform/ndk.git/+/ndk-r14-release/docs/UnifiedHearders.md
—api: Android系统版本
--install-dir:生成的交叉编译工具链输出位置,可自行设置
 
3、编译方法
通常类Unix系统下,C/C++源码都是通过Makefile组织的(或者通过一个configure脚本生成Makefile),所以我们要阅读其Makefile(或configure脚步),将其编译器指定为我们的android交叉编译器,然后在编译过程中会遇到一下函数为定义等错误,这是因为andorid的bionic C库和纯Linux的C库差别导致的,比如某些函数在bionic中不支持,对这些函数,将其干掉或者替换,或者自己重写,等等。下面总结下通常要做的几点:
1)查看目标源码的Makefile文件,将交叉编译器指定为咱们安装的交叉编译器
通常是修改CC环境变量
CC= /path_to_your_cross_compiler/you_cross_compiler_xxx_gcc
 
2)CFLAGS加上“-pie -fPIE”选项,否则报错:
error: only position independent executables (PIE) are supported
 
3) 一下编译参数不支持,要去掉
#PTHREAD_LIBS= -lpthread -lrt
 
4、小试牛刀
新建一个hello.c文件:
#include 
int main(void){ printf("Hello, this is a program compiled by ndk-cross-compiler!\n");}
 编译:
/Users/nickyang/android-build/bin/aarch64-linux-android-gcc -pie -fPIE hello.c -o hello
推送到android设备并执行(默认是ARM64架构):
NickPro:tmp nickyang$ adb push hello /datahello: 1 file pushed. 0.1 MB/s (7808 bytes in 0.112s)NickPro:tmp nickyang$ adb shellgeneric_arm64:/ # cd datageneric_arm64:/data # ls -l | grep hello-rwxrwxrwx  1 root     root     7808 2018-02-18 16:20 hellogeneric_arm64:/data # ./helloHello, this is a program compiled by ndk-cross-compiler!10|generic_arm64:/data #

执行成功,顺利输出打印!

 

转载于:https://www.cnblogs.com/yanghaizhou/p/8453424.html

你可能感兴趣的文章
UIMenuController的使用
查看>>
Python异常处理
查看>>
python optparser模块
查看>>
Scala中隐式类代码实战详解之Scala学习笔记-53
查看>>
lammps input for water
查看>>
apache设置虚拟域名以及多站点
查看>>
nginx 日志 cron任务切割日志
查看>>
echarts添加点击事件
查看>>
html实现“加入收藏”代码
查看>>
应收账款对账表
查看>>
ns2仿真结束的.tr文件中的数据意义
查看>>
sqlite3 数据类型 批量插入
查看>>
The fundamental differences between "GET" and "POST"
查看>>
定义类/实例(Class)
查看>>
LINUX内核分析第六周学习总结——进程的描述和进程的创建
查看>>
机器学习之最优化问题
查看>>
MFC获得当前用户等信息
查看>>
在javascript中substr和substring的区别是什么
查看>>
java并发回答
查看>>
C++_基础2-复合数据类型
查看>>