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

1、NDK下载

https://developer.android.google.cn/ndk/downloads/index.html

本文以宿主机系统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 <stdio.h>

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 /data
hello: file pushed. 0.1 MB/s ( bytes in .112s)
NickPro:tmp nickyang$ adb shell
generic_arm64:/ # cd data
generic_arm64:/data # ls -l | grep hello
-rwxrwxrwx root root -- : hello
generic_arm64:/data # ./hello
Hello, this is a program compiled by ndk-cross-compiler!
|generic_arm64:/data #

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

 

Android独立交叉编译环境搭建的更多相关文章

  1. android NDK开发环境搭建

    android NDK开发环境搭建 2012-05-14 00:13:58 分类: 嵌入式 基于 Android NDK 的学习之旅-----环境搭建 工欲善其事必先利其器 , 下面介绍下 Eclip ...

  2. Android studio 开发环境搭建

    Android studio 开发环境搭建 一.环境: 下载java jdk:http://www.oracle.com/technetwork/cn/java/javase/downloads/jd ...

  3. Android入门之环境搭建

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/1376935560.html 原创:An ...

  4. Android自动化测试之环境搭建

    Android自动化测试之环境搭建 一.Android-sdk介绍 SDK(Software development kit)软件开发工具包.被软件开发工程师用于为特定的软件包.软件框架.硬件平台. ...

  5. Exynos4412交叉编译环境搭建

    Exynos4412交叉编译环境搭建 交叉编译:在PC机(x86平台)上开发程序,在ARM板上运行,提高开发.编译速度. 环境: Tiny4412SDK1506开发板 需要软件: arm-linux- ...

  6. Android自动化测试-UiAutomator2环境搭建

    Android自动化测试-UiAutomator环境搭建(QQ交流群:490451176) 一.环境准备 1. 安装android sdk,并配置环境变量 2. 安装android studio,国内 ...

  7. android测试开发环境搭建

    本文档针对未接触过android的0基础人员,在开始熟悉android之前,首先需要一个学习环境来支撑,在此简单介绍一下android环境搭建.(当然大家也可以百度.谷歌,类似的文档很多) 环境搭建: ...

  8. Ubuntu系统下arm-linux-gcc交叉编译环境搭建过程

    搭建所需环境Linux版本:Ubuntu 14.10 交叉编译器版本:arm-linux-gcc-4.4.3资源链接 何为交叉编译环境搭建交叉编译环境,即安装.配置交叉编译工具链.在Ubuntu环境下 ...

  9. YA157C交叉编译环境搭建

    目录 1.开发板简介 3.主机搭建交叉编译环境 4.编译第一个ARM Linux程序--Hello World 5.在开发板上运行Hello World程序 6.ssh登录开发板 7.注意 8.she ...

随机推荐

  1. 条款5.了解c++默默编写并且调用了哪些函数。

    如果想在一个内含reference成员的class内支持赋值操作,必须自己定义copy assignment操作符.而且面对“内含有const成员的”class,编译器的反应也是相同的,由于更改con ...

  2. Java(Android)线程池妙用

    介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...

  3. 前端 velocity(.vm)模板里写ajax出现解析异常

    异常信息:Caused by: org.apache.velocity.exception.ParseErrorException: Encountered "{" at dist ...

  4. [JS学习笔记]浅谈Javascript事件模型

    DOM0级事件模型 element.on[type] = function(){} 兼容性:全部支持   lay1 lay2 lay3 e.target:直接触发事件的元素[IE8及以下不支持tage ...

  5. 有了Docker的程序猿们就能开启“上帝视角”?

    现在,如果有程序猿说不知道Docker,这将是难以想象的. 百科是这样描述Docker的."Docker是dotCloud开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植 ...

  6. Dojo Chart之常用统计图

    很多做web的都知道,在很多web系统中会涉及到一些统计图,例如饼状图,柱状图.趋势图.以及叠加图等.提到这儿,做web的都很熟悉的,jquery的highcharts就能搞定所有的涉及到统计图的功能 ...

  7. 专业工具软件AutoCAD复习资料

    专业工具软件AutoCAD复习资料 下载地址:http://download.csdn.net/detail/zhangrelay/9849503 这里给出了一些dwg格式的CAD资料,用于课后学习和 ...

  8. Leetcode 912. Sort an Array

    class Solution: def sortArray(self, nums: List[int]) -> List[int]: return sorted(nums)

  9. js 函数里的 this

    1,当作为纯粹的函数调用时, this指向调用出的环境的上下文,看下面的例子 var x = 1; function test(){ var x = 0; alert( alert(x); } tes ...

  10. Robot Framework接口测试(4)

    现在我们已经做好了进行接口测试的必要准备:1.拼接发送的报文:2.发送报文的方法.现在我们实现RF上的接口测试. 我们先对发送的方法进行一下封装: 1.拼接报文方法: #coding : utf-8 ...