转载:http://blog.csdn.net/smfwuxiao/article/details/6587709

首先需要确定目标机器的指令集。

如果是 x86 的机器,用 x86-4.4.3 版本的工具链;如果是 arm 指令的,用 arm-linux-androideabi-4.4.3 版本 (x86-4.4.3 和 arm-linux-androideabi-4.4.3 位于ndk目录中)

1、gcc 的sysroot 选项

sysroot 选项设定 gcc 在编译源码的时候,寻找头文件和库文件的根目录。可以这样调用 gcc --sysroot=/tmp/gcc-arm (及其他选项)。NDK 根目录下的 platforms 目录中的各个子目录的路径都可以直接传给 gcc --sysroot=<dir>。为了简化操作,可以在linux系统的命令终端执行以下命令,设置SYSROOT环境变量,$NDK是ndk的根目录。

$ SYSROOT=$NDK/platforms/android-8/arch-arm

2、调用 NDK gcc(第1种方法)。 设置 SYSROOT之后,要把它传给 gcc 的 --sysroot 选项。由于unix/linux自带的gcc并非交叉编译工具,而我们需要使用的是ndk中提供的交叉编译工具(也是gcc),所以需要想办法让编译脚本找到ndk中的gcc,而不要去寻找系统中的gcc。而 unix/linux 系统的编译脚本常常会用 CC 环境变量来引用编译器,所以通过把 CC 设置为ndk中的gcc的路径,就能帮助编译脚本找到正确的gcc(我们还能顺便加上--sysroot选项)。

将CC 按如下设置

$ export CC="$NDK/toolchains/<name>/prebuilt/<host-system>/bin/<prefix>gcc --sysroot=$SYSROOT"

$ $CC -o foo.o -c foo.c  (不必执行这一行,这条命令是调用gcc编译程序)

上面第1行之后之后,再去执行./configure 就可以编译出arm程序了。不过还需要考虑共享库的链接问题,要确保该程序没有链接ndk未提供的共享库。该方法的缺陷就是,不能使用 C++ STL(STLport 或 GNU libstdc++ ),也不能使用异常机制和RTTI。

3、调用NDK编译器(第2种方法,更简单)

android ndk 提供脚本,允许自己定制一套工具链。例如:

$NDK/build/tools/make-standalone-toolchain.sh --platform=android-5 --install-dir=/tmp/my-android-toolchain [ --arch=x86 ]

将会在/tmp/my-android-toolchain 中创建 sysroot 环境和 工具链。--arch 选项选择目标程序的指令架构,默认是为 arm。

如果不加 --install-dir 选项,则会创建 /tmp/ndk/<toolchain-name>.tar.bz2。

(执行 make-standalone-toolchain.sh --help 查看帮助。)

运行之后,这样使用:

$ export PATH=/tmp/my-android-toolchain/bin:$PATH

$ export CC=arm-linux-androideabi-gcc

$ export CXX=arm-linux-androideabi-g++

$ export CXXFLAGS="-lstdc++"

执行完以上设置环境变量的命令之后,就可以直接编译了(例如,执行 ./configure 然后 make 得到的就是 arm 程序了)。不用再设定 sysroot, CC 了。而且,可以使用 STL,异常,RTTI。

4、ABI 兼容性

ndk 同时支持 arm5 和 arm7,一般只用 arm5就好了。arm7是高端一点的,NDK 默认也是 arm5 。

推荐加上 -mthumb 选项给gcc,来生成 16-bit Thumb-1 指令。

如果要用 arm7,可以设定 CFLAGS='-march=armv7-a -mfloat-abi=softfp', 使用 Thumb-2 指令,且这两个选项不能分开!

5、警告 & 限制

5.1 Windows支持

Windows 上的NDK 工具链不依赖 Cygwin,因而速度比用 Cygwin 快一点,但是这些工具不能理解

Cygwin 的路径名(例如, /cygdrive/c/foo/bar)。只能理解  C: /cygdrive/c/foo/bar 这类路径

不过,NDK 提供的build工具能够很好地应对上述问题(ndk-build)

5.2 wchar_t 支持

wchar_t  类型仅从 Android 2.3 开始支持。

在 android-9 上, wchar_t 是 4字节。 并且 C语言库提供支持宽字符的函数

(例外:multi-byte 编码/解码 函数 和 wsprintf/wsscanf )

在android-9 以前的平台上,wchar_t 是1字节,而且宽字符函数不起作用。

建议不使用 wchar_t,提供 wchar_t 支持是为了方便移植以前的代码。

5.3  异常, RTTI 和 STL

NDK 工具链默认支持C++异常和RTTI(Run Time Type Information),可以用 -fno-exception 和 -fno-rtti 关闭(生成的机器码更小)

注意: 如果要用这两个特性,需要显式链接 libsupc++。例如: arm-linux-androideabi-g++ .... -lsupc++

NDK 提供了 libstdc++,因而可以用 STL,但需要显式链接 libstdc++ ( gcc ... -lstdc++)。不过在将来可以不用手动指定这个链接参数。

Android NDK 工具链的使用方法(Standalone Toolchain)的更多相关文章

  1. iperf linux版本移植到android (使用工具链方式不是使用Android.mk)

    由于很多程序是用makefile编译linux应用程序的,如果移植到android就要重新写Android.mk,对于不熟悉这个的人来说,特别麻烦,所以这里介绍只修改makefile就能移植到andr ...

  2. Ubuntu安装ARM架构GCC工具链(ubuntu install ARM toolchain)最简单办法

    一.安装ARM-Linux-GCC工具链 只需要一句命令: sudo apt-get install gcc-arm-linux-gnueabi 前提是你的Ubuntu系统版本是官网支持的最新的版本, ...

  3. 【转】Ubuntu安装ARM架构GCC工具链(ubuntu install ARM toolchain)最简单办法

    原文网址:http://www.cnblogs.com/muyun/p/3370996.html 一.安装ARM-Linux-GCC工具链 只需要一句命令: sudo apt-get install ...

  4. Android NDK:Aborting..Stop的处理方法

    在eclipse中配置cocos2d-x的android环境时,遇到这样的错误提示 网上搜索了一下,说是在NDK_MODULE_PATH环境变量下未找到所需要的Android.mk文件,后来仔细研究了 ...

  5. android更换工具链

    欢迎转载opendevkit文章, 文章原始地址: http://www.opendevkit.com/?e=73 android编译系统是跟随android源码一起发布的,使用了gcc编译器,也就是 ...

  6. cmake工具链

    命令project() enable_language()try_compile() 变量CMAKE_<LANG>_COMPILERCMAKE_<LANG>_COMPILER_ ...

  7. xmake v2.5.2 发布, 支持自动拉取交叉工具链和依赖包集成

    xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能 ...

  8. Android NDK 导出独立工具链

    传统方式调试 NDK 开发的程序比较麻烦,先要编译成 JNI,又要导出 java接口,还要再写一个 java 工程,改一个地方又要连续改几处,这样效率是很低的.最频繁使用的关键工作路径(编译/调试环节 ...

  9. 使用ndk standalone工具链来编译某个平台下的库

    地址: http://www.kandroid.org/ndk/docs/STANDALONE-TOOLCHAIN.html It is now possible to use the toolcha ...

随机推荐

  1. npm发布插件步骤

    开发好一个插件后,要想让其他人也能使用该插件需要将插件发布到npm上,具体步骤如下: 1.添加npm用户: npm adduser Username: your name Password: your ...

  2. 多线程之synchronized

    Java并发编程:synchronized 虽然多线程编程极大地提高了效率,但是也会带来一定的隐患.比如说两个线程同时往一个数据库表中插入不重复的数据,就可能会导致数据库中插入了相同的数据.今天我们就 ...

  3. (未解决)记录一次登录&jmeter,留下的一地鸡毛

    一般的登录校验过程是这样的:客户端发起请求,拿到服务器给的“令牌”,再次发起请求,服务器验证“令牌”是否正确,从而返回给客户端是登录成功还是登录失败.然后我按照这个流程,用jmeter去模拟了登录过程 ...

  4. 如何在C#程序中模拟域帐户进行登录操作 (转载)

    .NET Core .NET Core也支持用PInvoke来调用操作系统底层的Win32函数 首先要在项目中下载Nuget包:System.Security.Principal.Windows 代码 ...

  5. KVM的初始化过程

    之前打算整理一下在Guest VM, KVM, QEMU中IO处理的整个流程,通过查阅资料和阅读源码,已经大致知道IO在Guest KVM中的处理流程.当想要整理IO在KVM和QEMU中的处理时,发现 ...

  6. [原创]升级Gerrit的commit-msg,检查git commit时必须填写开发任务编号TaskID

    公司使用git+gerrit+jenkins进行持续集成实践,其中gerrit用来进行Code Review.另外我们自己研发了一套敏捷项目管理系统TPM(TeamPlus Management),用 ...

  7. Linux基础命令之文件过滤及内容编辑处理(二)

    . wc 用于统计文件的行数,单词,或字节数 -l # 统计行数 -L # 打印最长行的长度,一般脚本中判断字符长度 -c # 统计字节数 -w # 统计单词数 -m 统计字符数 . iconv 转换 ...

  8. 浅析 golang module

    什么是 module?module 解决了什么问题? module 代表一个版本管理单元,它包括一个或者多个 packages. 一般来说,一个版本控制仓库(比如 golang.org/x/text  ...

  9. 关于Matlab在绘图时中文字体显示不一致的问题

    我的运行环境: OS: Win10 教育版 64-bit Matlab版本:Matlab 2017a  64-bit 在使用Matlab绘图时,而横坐标轴.纵坐标轴.标题有汉字时,会发现在GUI的显示 ...

  10. JAVA-SPI机制-实现功能的热插拔

    一.序: 开发中经常遇到的一个需求是,处理不同种类的数据,但是完成的功能是相似的,功能随着传入类型的不同而变化 二.方案: 1.定义接口:定义一个接口,编写不同的实现类 (1)使用场景:完成功能相同, ...