美文网首页
使用ndk中的gcc编译Android可执行文件

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

作者: 千山万水迷了鹿 | 来源:发表于2018-06-06 18:21 被阅读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。

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

    相关文章

      网友评论

          本文标题:使用ndk中的gcc编译Android可执行文件

          本文链接:https://www.haomeiwen.com/subject/zhqisftx.html