美文网首页Android NDK
CMake编译Android可执行程序

CMake编译Android可执行程序

作者: 温柔可爱小阿邴 | 来源:发表于2019-12-27 23:02 被阅读0次

    编译环境

    • 通过过Android Studio内置的SDK Manager下载NDK和CMake;
    • 把环境变量ANDROID_SDK_HOME指向Android SDK目录,并把ANDROID_SDK_HOME添加到PATH环境变量中。

    HelloWorld

    HelloWorld是每个程序员编写的第一个程序,因此本例也从HelloWorld开始。这里为了便于后续项目的编译和管理,首先新建文件夹helloworld,然后在此文件夹下编写helloworld.c源文件:

    #include <stdio.h>
    
    int main()
    {
        printf("Hello World!\n");
        return 0;
    }
    

    CMakeLists.txt

    由于使用CMake进行编译可执行程序,需要配置文件CMakeLists.txt。在helloworld文件夹下编写CMakeLists.txt:

    # CMake最低版本号要求
    cmake_minimum_required(VERSION 3.6)
    
    # 项目信息
    project (helloworld)
    
    # 设置目标文件的名字
    set(TARGET_NAME helloworld)
    
    # 生成可执行文件
    add_executable(${TARGET_NAME}
                    helloworld.c
    )
    

    build脚本

    在执行cmake命令生成Android可执行文件时需要带上长长的参数,为了简化此步骤,这里编写一个脚本build.bat

    set abi=armeabi-v7a
    
    if not exist %abi% md %abi%
    cd %abi%
    
    %ANDROID_SDK_HOME%/cmake/3.10.2.4988404/bin/cmake ^
      -DANDROID_ABI=%abi% ^
      -DANDROID_NDK=%ANDROID_SDK_HOME%/ndk-bundle ^
      -DCMAKE_BUILD_TYPE=Debug ^
      -DCMAKE_TOOLCHAIN_FILE=%ANDROID_SDK_HOME%/ndk-bundle/build/cmake/android.toolchain.cmake ^
      -DANDROID_NATIVE_API_LEVEL=9 ^
      -DANDROID_TOOLCHAIN=clang -DCMAKE_GENERATOR="Ninja" ^
      -DCMAKE_MAKE_PROGRAM=%ANDROID_SDK_HOME%/cmake/3.10.2.4988404/bin/ninja ^
      ..
    
    %ANDROID_SDK_HOME%/cmake/3.10.2.4988404/bin/ninja
    cd ..
    

    脚本中的3.10.2.4988404指的是CMake的版本,需要根据实际下载的CMake版本进行修改。执行此脚本,将在helloworld/armeabi-v7a目录下生成helloworld可执行文件。

    编译脚本中%ANDROID_SDK_HOME%/ndk-bundlendk-bundle可能不是这个文件夹,比如现在版本AndroidStudio下载的Ndk文件夹就是sdk\ndk\20.1.5948944,要将编译脚本中的ndk-bundle替换为ndk\20.1.5948944

    由于使用的是Windows系统,这里给出的是bat脚本,Linux/Mac的shell脚本可根据bat脚本进行相应的修改。

    运行测试

    使用Android手机通过USB数据线连接电脑,或者使用模拟器,获取root权限:

    adb root
    adb shell
    

    进入shell后,获取root权限会显示:

    generic_x86_64:/ #
    

    进入shell后,未获取root权限会显示:

    generic_x86_64:/ $
    

    将生成的helloworld可执行文件通过adb命令push到设备上:

    adb push helloworld /data/local/tmp
    

    使用adb shell命令进入Android命令终端,在运行helloworld之前,先为helloworld文件添加可执行权限:

    chmod 777 /data/local/tmp/helloworld
    

    执行helloworld命令可以看到如下输出:

    generic_x86_64:/ # /data/local/tmp/helloworld
    ./helloworld not executable :32-bit ELF file
    

    又是一个坑,在使用AndroidStudio的模拟器时候,因为我们编译出来的是armeabi-v7a的可执行文件,所以在创建模拟器的时候也要创建相对应的模拟器,不能使用x86的模拟器。

    模拟器

    启动模拟器后,重复上面的步骤,最终我们可以看到下面的输出:

    generic:/data/local/tmp # ./helloworld
    Hello World!
    

    总结

    编译Android可执行程序可以使用ndk-build,不过官方已经不推荐使用了;也可在Android源码的中进行编译,可是Android源码的编译环境也不容易搭建,如果已有编译环境的情况下另当别论;因此本例利用Android Studio中的CMake和NDK进行编译可执行文件,对于Android应用开发者来说是最便利的方法之一。

    相关文章

      网友评论

        本文标题:CMake编译Android可执行程序

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