Android NDK 工具链的使用方法
来源:互联网 发布:mac 汉仪 启功体下载 编辑:程序博客网 时间:2024/05/16 01:17
首先确定目标机arch,
如果是 x86 的,用 x86-4.4.3 工具链;
如果是 arm 的,用 arm-linux-androideabi-4.4.3。
1、sysroot
sysroot 指的是gcc在编译的时候,寻找头文件和共享库文件的根目录。 可以用 gcc --sysroot=/tmp/gcc-arm设定。
NDK 根目录下的 platforms 子目录提供各种 native API level 的 sysroot 。
$ SYSROOT=$NDK/platforms/android-8/arch-arm
2、调用 NDK gcc。 设置了 SYSROOT之后,要把它传给 gcc 的 --sysroot 选项才会起作用。也可以用 CC 环境变量设定编译器。
$ export CC="$NDK/toolchains/<name>/prebuilt/<host-system>/bin/<prefix>gcc --sysroot=$SYSROOT"
$ $CC -o foo.o -c foo.c
设置了CC这个环境变量之后,configure 脚本也可以调用NDK的gcc。
该方法的缺陷就是,不能用 C++ STL(STLport 或 GNU libstdc++ ),也不能使用异常机制和RTTI。
3、调用NDK编译器(更简单)
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 兼容性
只要用 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 工具链的使用方法
- Android NDK 工具链的使用方法
- Android NDK 工具链的使用方法(Standalone Toolchain)
- Android NDK 工具链的使用方法(Standalone Toolchain)
- Android NDK 工具链的使用方法(Standalone Toolchain)
- Android NDK 工具链的使用方法(Standalone Toolchain)
- Android NDK 工具链的使用方法(Standalone Toolchain)
- Android NDK 工具链的使用方法(Standalone Toolchain)
- Android NDK 工具链的使用方法(Standalone Toolchain)
- Android NDK 工具链的使用方法(Standalone Toolchain)
- Android NDK 工具链的使用方法(Standalone Toolchain)
- Android NDK 提供的交叉工具链手动编译源码
- Android NDK 提供的交叉工具链手动编译源码
- Android NDK 提供的交叉工具链手动编译源码
- Android NDK 开发教程三:NDK使用方法
- Linux系统制作android NDK工具链
- Mac自定义Android ndk工具链toolchain
- Android NDK自定义交叉编译工具链
- Android ApiDemos详解之App_Activity_IntentActivityFlags(7)
- Java调用Oracle存储过程(无返回值)
- Apache Mahout:适合所有人的可扩展机器学习框架
- 2012年工作学习计划——与天下同行共勉
- 利用Flash AS2.0实现读取php xml数据和插入记录
- Android NDK 工具链的使用方法
- 我的Android学习笔记之一:Android开发环境搭建
- GCC Spec Files
- 简单javascript汇总
- 分享 C#不用treeview控件生成漂亮的树型结构
- PHP 基本的文件上传
- 计算2进制数中1的个数
- OpenCV运行namedWindow时,debug版本下正常,release版本下报错
- 浏览器缓存页面或图片问题解决方案