使用ndk中的gcc编译Android可执行文件
前一篇文章写过通过ndk-build 简单的编译Android 中c库的方式了,这里再用更底层的方式,直接通过ndk中的gcc来编译。
前提条件
开发环境:mac Os
必须下载ndk,我用的是r17。
ndk在~/.bash_profile
中配置环境变量
export ANDROID_NDK_HOME=/Users/用户名/Development/android-ndk-r17
export PATH=${PATH}:${ANDROID_NDK_HOME}:${ANDROID_NDK_HOME}/toolchains/arm-l inux-androideabi-4.9/prebuilt/darwin-x86_64/bin
然后这样可以直接使用gcc工具了,命令测试一次:
$ arm-linux-androideabi-gcc
编译一个例子
hello.c的代码如下
#include <stdio.h>
int main() {
printf("hello,world!");
return 0;
}
然后命令行运行:
$ arm-linux-gcc hello.c -o hello
但是,缺报错了:
fatal error: stdio.h: No such file or directory
解决方法
接下来您需要做的是定义您的 sysroot(sysroot 是一个包含针对您的目标的系统标头和库的目录)。 如需定义 sysroot,您必须知道原生支持的目标 Android API 级别;可用的原生 API 因 Android API 级别而异。
针对相应 Android API 级别的原生 API 位于 $NDK/platforms/ 下;每个 API 级别目录又包含针对各种 CPU 和架构的子目录。 以下示例显示如何针对 ARM 架构为以 Android 5.0(API 级别 21)为目标的构建定义 sysroot:
SYSROOT=$ANDROID_NDK_HOME/platforms/android-21/arch-arm
注: 这里的ANDROID_NDK_HOME 和前面自己设置的ndk的根目录变量名要对应起来
然后在进行编译就能通过了:
export CC="$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/ \
linux-x86/bin/arm-linux-androideabi-gcc-4.8 --sysroot=$SYSROOT"
$ CC -o hello.o -c hello.c
尽管此方法很简单,但它缺少灵活性:它不允许您使用任何 C++ STL(STLport、libc++ 或 GNU libstdc++)。 它也不支持例外或 RTTI。
具体复杂的编译去看官网吧,我只不过想分步编译,观察编译过程而已。