前言

为了能够在Android平台上使用一些Linux中的C/C++库,我们需要使用AndroidNDK来编译那些Linux库的源代码,使用NDK开发时,通常使用Android.mk或者Cmake来构建C/C++代码

但是一般Linux库是通过一个configure脚本来生成MakeFile的方式来构建的,在Linux上构建一个Linux库的一般流程如下:

./configure
make
make install

这样的话就和我们通常使用NDK时构建C/C++代码的方式不一样

一种常见的解决方法就是把configure生成的MakeFile手动转换为Android.mk或者CmakeList.txt,这种方法在项目规模比较小的时候还比较可行。但是当项目比较庞大,依赖复杂时,就很难去进行转换了,那么我们就想能不能像上面一样直接用configure生成MakeFile来进行编译呢?答案是完全可以,而且这种方法相对于转换MakeFile的方法还更加简单易行

我们基本的思路就是在进行编译的时候,把我们默认用的gcc、g++、ld等编译工具替换成AndroidNDK中所提供的编译工具来进行交叉编译就行了,接下来的内容以在lubuntu 64位系统上为例就讲解了搭建编译环境的过程

参考官方文档:https://developer.android.com/ndk/guides/standalone_toolchain.html

下载Android NDK

首先到官网下载Android NDK并解压到某一位置

下载地址:https://developer.android.com/ndk/downloads/index.html

本文中NDK版本为ndk-r14b-linux-x86_64

运行NDK中的环境搭建脚本

终端下进入到AndroidNDK目录/build/tools/下

运行如下命令

./make_standalone_toolchain.py --arch arm --api 24 --unified-headers --install-dir ~/android-build

参数解释:

–arch:交叉编译的目标平台架构,因为我们的Android手机基本都是arm平台,因此这里写arm

–unified-headers:使用libc头文件,相关解释可以参考 https://android.googlesource.com/platform/ndk.git/+/ndk-r14-release/docs/UnifiedHeaders.md

–api:Android系统的版本

–install-dir:生成的交叉编译构建工具的输出位置,这里我把交叉编译工具生成到了~/android-build下,当然你也可以设置成别的路径

这个脚本是Android NDK中官方所提供的脚本,功能就是搭建一个交叉编译环境,脚本的更多参数和详情请参考前言中给出的官方文档

编写脚本模版

在Android交叉编译工具文件夹的根目录下新建一个脚本文件android-build.sh,内容如下:

#!/bin/bashANDROID_BUILD=上一步中你生成的Android交叉编译工具的路径
API_VERSION=24
PATH=$ANDROID_BUILD/bin:$PATH
SYSROOT=$ANDROID_BUILD/sysroot
HOST=arm-linux-androideabi
CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -D__ANDROID_API__=$API_VERSION"
CXXFLAGS="-std=c++11"
LIBDIRS="-L$ANDROID_BUILD/arm-linux-androideabi/lib"
LDFLAGS="-march=armv7-a -Wl,--fix-cortex-a8 $LIBDIRS"
CONFLAGS="--prefix=${SYSROOT}/usr --host=$HOST"
PKG_CONFIG_PATH="$SYSROOT/usr/lib/pkgconfig"#configure
PKG_CONFIG_PATH=$PKG_CONFIG_PATH CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" LDFLAGS="$LDFLAGS" ./configure $CONFLAGS &&#make & install
make && make install

这是一个用来编译Linux库的脚本模版,之后我们要为Android编译某个Linux库的时候,在这个脚本模版的基础上进行修改即可

我们可以看到这个脚本中定义了许多变量,这些变量都是一些编译的时候要用到的参数,我们可以看到在脚本中运行configure的时候我们把这些参数传了进去,这样我们就可以通过这些参数指定用我们的交叉编译工具来编译

脚本中的变量解释如下:

ANDROID_BUILD:Android交叉编译工具的路径

PATH:我们把交叉编译工具根目录下的bin文件夹的路径加入了PATH环境变量中,这样我们就可以直接运行bin文件下的那些工具了

SYSROOT:编译时所使用的系统根目录的路径,这里解释下这个系统根目录是什么意思:我们PC上的Linux系统根目录就是/,我们在编译的时候会用到一些系统根目录中的文件,例如我们为PC上的Linux编译一些C/C++代码的时候要用到/usr/include中的头文件,还要用到/usr/lib中的一些库,还可能要执行/bin下的一些程序。但是此时我们是要为Android平台进行交叉编译,此时用到的头文件、库等得是Android平台的,因此我们要使用交叉编译工具提供的系统根目录$ANDROID_BUILD/sysroot

HOST:编译的目标平台,我们在configure的参数指定了–host=$HOST(即–host=arm-linux-androideabi)之后,编译时就会使用形如arm-linux-androideabi-XXX的工具,例如编译时使用的gcc就会是arm-linux-androideabi-gcc,使用的g++就会是arm-linux-androideabi-g++。还记得之前我们把$ANDROID_BUILD/bin这个路径加入到PATH环境变量了吗?arm-linux-androideabi-gcc、arm-linux-androideabi-g++这些编译工具的文件就在这个bin文件中

CFLAGS:gcc所用的参数,为什么要传入那些参数请参考前言中官方文档链接

CXXFLAGS:g++所用的参数,这里指定了要使用c++11标准

LIBDIRS:库文件的路径,这里是把Android的C++STL库的路径加入了库路径

LDFLAGS:链接器ld使用的参数,为什么要传入那些参数请参考前言中的官方文档链接

CONFLAGS:运行configure脚本时要传入的参数,–prefix是指定了make install时的安装路径,–host前面解释过了

PKG_CONFIG_PATH:具体的解释可以参考这里 http://www.cppblog.com/colorful/archive/2012/05/05/173750.aspx

可以看到我们这个脚本中进行编译的过程也是先执行configure,然后make和make install,和一般Linux编译的过程一样,只是需要指定一些平台的参数

之后如果我们为Android编译一些Linux库,只要把这个脚本复制到合适的位置并进行一些简单的修改,然后运行这个脚本就可以了,十分方便


Similar Posts

  • 编译Android平台上的qemu
  • C语言中的地址对齐
  • C语言中声明的语法/语义详解
  • C++中的构造函数(二):构造函数代码扩张
  • C++中的构造函数(一):默认构造函数
  • C++基础学习笔记

Linux下搭建Android交叉编译环境相关推荐

  1. 怎么查看linux是不是as7u4,Linux下搭建Android开发环境

    为什么要在Linux搭建开发环境呢?从直观来说,Android虚拟机在Linux下运行速度更快,而且性能更稳定. 我使用的Linux环境是ubuntu-10.10-desktop-i386.安装前所需 ...

  2. 在win8.1 64位系统+cocos2d-x2.2.3下搭建android交叉编译环境

    搭建前须要下载的软件包(默认已搭建好cocos2d-x而且可在VS上执行,本人VS版本号为2013): 1:java 下载地址:http://www.java.com/zh_CN/download/m ...

  3. cocos2d-x在win7下的android交叉编译环境

    cocos2d-x在win7下的android交叉编译环境 前面把Visual Studio+Python开发环境配好了,但还没有讲如何在Android中使用创建好的项目,本篇博客介绍如何在win7下 ...

  4. ubuntu下搭建android开发环境(转载)

    在ubuntu下搭建android开发环境,准备学习一下android开发. 1.安装JDK        首先到oracle的官网上下载linux版本的JDK(网址为:http://www.orac ...

  5. 在UBUNTU LINUX下搭建 ANDROID开发

    菜鸟系列之一:在 UBUNTU LINUX下搭建 ANDROID开发 第一步:激活 ROOT用户.................................................... ...

  6. 在Linux下搭建 miniGUI mStudio环境

    嵌入式环境搭建准备工作 Linux操作系统:ubuntu 8.04 准备好mStudio 安装文件和运行mStudio的第三方软件 在Eclipse官方网站http://www.eclipse.org ...

  7. ubuntu下搭建android开发环境(四)核心篇安装AndroidStudio、sdk、jdk

    [置顶] ubuntu下搭建android开发环境(四)核心篇安装AndroidStudio.sdk.jdk(by 星空武哥) <div class="article_manage c ...

  8. 在Windows环境下搭建Android开发环境

    标题:在Windows环境下搭建 Android 开发环境 作者:CrazyPebble 时间:2011年2月28日 声明:此文在参考其他网上资料以及笔者实践总结写下,一来自己可以做一些总结,二来给跟 ...

  9. Linux 下搭建 Scala 开发环境

    在实际开发中,我们的项目是部署到 linux,因此,我们需要在 Linux 下搭建 scala 的环境. 具体的步骤如下: 下载对应的 scala 的安装软件.scala-2.11.8.tgz 通过远 ...

最新文章

  1. Java克隆(Clone)的应用
  2. spring与springBoot不同之处
  3. C# ,asp.net 获取当前,相对,绝对路径
  4. C++中struct和class关键字的区别
  5. 疯狂吸金1600个亿的拼多多,社交网络分析到底隐藏多少财富?
  6. 冰豹lua驱动设置_通过编写“猜数字”游戏学习 Lua | Linux 中国
  7. 缓冲池java_了解Java缓冲池
  8. 各种IE(IE6-IE10)兼容问题一行代码搞定
  9. 为什么要使用Redis?
  10. glib wpa_supplicant Unix上库编译错误解决与总结
  11. 微信小程序盲盒系统源码 带教程
  12. Design Tradeoffs for SSD Performance
  13. w3c 整站 php源码,W3C联盟系统 v1.3
  14. 有效利用PLM系统能为企业带来什么?
  15. C#的DataTable详解
  16. 微信小程序顶部导航栏颜色修改
  17. pca , nmds , pcoa 图添加分组的椭圆
  18. 达梦数据库实例服务无法启动(一)
  19. 记一次WebService调用踩的坑
  20. JPAQuery日期分组查询

热门文章

  1. python中next(reader)_Python错误self.reader.next()
  2. Android studio中git密码记住的问题
  3. python右键没有idle编辑了_Python文件右键找不到IDLE打开项解决办法
  4. Elasticsearch索引备份与清理
  5. 微信OAuth2.0网页授权设置一个域名需多个域名使用的问题
  6. Mysql 中的事件//定时任务
  7. 【图的DFS】图的DFS非递归算法
  8. oracle的SCN和Checkpoint_Change#的关系
  9. iomem—I/O映射方式的I/O端口和内存映射方式的I/O端口
  10. praying,blessing,wishing