使用ndk中的gcc编译Android可执行文件

2018-06-06  本文已影响128人  千山万水迷了鹿

前一篇文章写过通过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。

具体复杂的编译去看官网吧,我只不过想分步编译,观察编译过程而已。

上一篇下一篇

猜你喜欢

热点阅读