专栏首页音视频直播技术专家Linux/Mac 交叉编译 Android 程序

Linux/Mac 交叉编译 Android 程序

什么是交叉编译呢

简单地说,就是程序的编译的环境和它的运行的环境不一样。即在一个平台上生成另一个平台上的可执行代码。交叉编译的概念主要和嵌入式开发有关。

为何要有交叉编译

主要是由于目标环境中各种资源都相对有限,所以很难直接进行本地编译。

交叉编译工具链

1. 什么是交叉编译工具链

交叉工具链是指可以生成目标环境可运行代码的工具集。我们知道,在Linux系统中的编译工具链包括以下一些工具, 编译器gcc, 链接器ld, 归档工具ar等等,如果在 Linux 环境中交叉编译 Android 系统环境可运行的代码,是不能直接使用Linux下的编译工具的,而应该使用 Android NDK 里的工具链,它们对应的名子为 arm-linux-android-gcc, arm-linux-android-ld等等。

2. 交叉编译工具的命名规则

arch-[vendor]-kernel-system-toolname。它由五部分组成,下面分别解释一下每部分的含义:

  1. arch,指的是CPU架构, 一般包括如下几种架构: arm, mips, powerpc, x86, x86_64。
  • verdor, 一般指的是生产厂商, 如果没有生产厂商可以为空。
  • kernel, 指的目标环境使用的 kernel,以android为例,它使用的是 linux内核,所以在这部分会填写为linux。
  • system, 指的是那个系统, 如androideabi, android
  • toolname: 指的是 gcc, ld, ar等。

所以我们可以看到 android 的编译工具的名子会写成 arm-linux-andirod-gcc。

3. 交叉编译常用变量说明

在做交叉编译时,我们常会在脚本中定义一些环境变量以方便我们命名用,常用的环境变量如下:

  1. PREFIX: 指明交叉编译后输出的目录。
  • ARCH: 指明交叉编译后输出的CPU架构。
  • CROSS-PREFIX:指明交叉编译前辍 arch-vender-kernel-system
  • SYSROOT: 指明交叉编译目标机器的头文件和库文件目录
  • TOOLCHAIN: 指明交叉编译工具链的位置。
  • PLATFROM: 指明交叉编译时使用的是哪个版本的的头文件和库文件。它是 SYSROOT的一部分。
  • ANDROID_NDK: 指明 Android NDK 所在目录。

如何进行交叉编译

  1. 通过设置configure 参数来生成交叉编译的 Makefile 文件

** —arch 指定架构 ** ** —cross-prefix 交叉编译工具链前辍 ** ** —sys root 交叉编译树的根 **

  1. 例了 以ffmpeg的交叉编译为例,我们可以来看一下如果生成交叉编译的Makefile。
export ANDROID_NDK=/Users/lichao/Downloads/android-ndk-r10e
./configure 
--target-os=linux 
--arch=arm --enable-cross-compile 
--cross-prefix=/Users/lichao/Downloads/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi- 
--sysroot=/Users/lichao/Downloads/android-ndk-r10e/platforms/android-9/arch-arm/ #这个很重要,没有的话就无法进行编译。

执行后的结果如下:

 install prefix            /usr/local
source path               .
C compiler                arm-linux-androideabi-gcc
C library                 bionic
host C compiler           gcc
host C library            
ARCH                      arm (armv5te)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 「WebRTC」iOS运行AppRTCMobile

    最近在看 iOS 下WebRTC的代码。想在真机上跑一下它的 Demo 程序 AppRTCMobile 看看是什么效果。但在编译并布署到真机上遇到了各种问题。历...

    音视频_李超
  • Android Gradle 初识

    最近在研究一些技术,需要一些Android相关的知识,但发现要想了解 Android,必须要了解 gradle。因为gradle是Android Studio指...

    音视频_李超
  • TypeScript入门

    TypeScript 是最近比较新的一门语言,它主要用于代替 JavaScript。为什么要推出 TypeScript 来代替 JavaScript呢? 主要...

    音视频_李超
  • 2018微服务狂热之死

    微服务在过去几年成为一个非常受欢迎的话题。 “微服务狂热”就像这样: Netflix在devops上非常棒。 Netfix做微服务。 所以:如果我做微服务,我也...

    企鹅号小编
  • JIT中的LogCompilation

    我们知道在JVM中为了加快编译速度,引入了JIT即时编译的功能。那么JIT什么时候开始编译的,又是怎么编译的,作为一个高傲的程序员,有没有办法去探究JIT编译的...

    程序那些事
  • selenium+phantomjs爬取

    今天自己实战写了个爬取京东商品信息,和上一篇的思路一样,附上链接:https://www.cnblogs.com/cany/p/10897618.html

    py3study
  • 「docker实战篇」python的docker-创建appium容器以及设置appium容器连接安卓模拟器(31)

    PS:通过docker appium的方式运行远程的虚拟机,真机也是一样啊,先通过adb devices,找到后,然后改成tcpip的形式,让docker ap...

    IT故事会
  • 介绍一个安卓远控木马

    安全10月24日讯 新型安卓远程管理工具“AhMyth Android RAT”的源码出现在GitHub上,用户可在GitHub下载并测试这款RAT。今天就体验...

    kevinfaith
  • 图 原

    图是有限集V和E的有序对,即G=(V,E)。其中V的元素称为顶点(也称为节点或点),E的元素称为边(也称为弧或线)。每一条边连接两个不同的顶点,而且用元组(i,...

    青木
  • 快速学习Git-Tortoise Git使用指南

    什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git...

    cwl_java

扫码关注云+社区

领取腾讯云代金券