我们经常需将一些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. Framework、Cocoa、Xcode

    什么是Cocoa? NeXTSTEP(以Unix作为内核的操作系统)内置的许多库(libraries)和工具,让程序员以一种优雅的方式与窗口管理器进行交互,这些libraries叫做Framework ...

  2. 用同步的方式执行jQuery异步动画

    在编写jQuery动画时,通过回调函数进行动画队列的编排,但当回调过多,往往会出现这样的代码: $(".box1").fadeIn(1000,function(){ $(" ...

  3. 【ACM非算法部分】scanf()函数

    scanf函数 格式说明符: %c    字符型 %d    十进制数 %i     读入十进制,八进制,十六进制数.输入的时候正常是十进制数,若输入0前缀的数将读入八进制,0x前缀读入16进制.若输 ...

  4. c 可变参数(variable argument)的原理及使用

    本文主要介绍可变参数的函数使用,然后分析它的原理,程序员自己如何对它们实现和封装,最后是可能会出现的问题和避免措施. VA函数(variable argument function),参数个数可变函数 ...

  5. 【PS实例】照片拼图的制作

    本系列教程将开始讲解PS的一些制作实例,通过实例的讲解同时介绍各种工具和面板机快捷键的使用,这样能够让大家更有兴趣学习,在学习的同时能够创造出自己喜欢的东西.本人使用的教程都是根据本人多次调试制作,仅 ...

  6. bzoj 2734 集合选数

    Written with StackEdit. Description <集合论与图论>这门课程有一道作业题,要求同学们求出\(\{1, 2, 3, 4, 5\}\)的所有满足以 下条件的 ...

  7. 接口测试基础——第2篇smtplib发送带附件的邮件

    我先给大家补充一个用QQ发送纯文本电子邮件的代码,用QQ的朋友可以参考一下: # coding=utf-8 import smtplib from email.mime.text import MIM ...

  8. gulp 合格插件评判标准

    官方插件列表:    https://gulpjs.com/plugins/   合格插件的判断标准 1. 不修改内容 如果一个插件一个文件都修改(无论是文案内容,文件路径),那么它就不是一个gulp ...

  9. openfaas 架构介绍

     此为官方介绍   Overview of OpenFaaS Function Watchdog You can make any Docker image into a serverless fun ...

  10. RESTful Get方式传参json格式后端400 解决方案

    前端采用vue+axios 后端采用spring boot restful 问题: 前端get 请求需要传递array 字段值 后端由于tomcat 版本问题,不支持url接受特殊字符包括 [] {} ...