1 准备环境

Windows系统上使用CMake交叉编译Android项目需要准备以下环境:

  • Android SDK
  • Android NDK
  • CMake

如果之前安装了Android Studio则可以使用Android Studio中安装的SDK、NDK、CMake。

2 在Windows上交叉编译Android项目示例

假设我们有一个这样的main.cpp,里面的代码如下

#include <iostream>

int main()
{
    double a = 1.0 + 5.0;
    std::cout << "sum = " << a << std::endl;
    return 0;
}

现在我们想让这个程序在Android上跑,而我们现在的操作系统是Windows,那么如何使用CMake将上面的代码编译成Android可以运行的可执行程序呢?

首先我们要为上述代码写一个CMakeLists.txt,内容如下

# CMake最低版本号要求
cmake_minimum_required(VERSION 3.6)

# 项目信息
project (AndroidCrossCompile)

# 设置目标文件的名字
set(TARGET_NAME android_corss_test)

# 生成可执行文件
add_executable(${TARGET_NAME} main.cpp)

然后我们新建一个build_android.bat Windows的批处理文件,在该文件中写入以下内容

@REM abi=armeabi armeabi-v7a arm64-v8a mips mips64 x86 x86_64
set abi=arm64-v8a
set ANDROID_SDK_HOME=F:/Software/Android/AndroidSDK/SDK
set ANDROID_NDK_HOME=F:/Software/Android/AndroidSDK/SDK/ndk/25.1.8937393
set ANDROID_SDK_CMAKE=%ANDROID_SDK_HOME%/cmake/3.22.1
set ANDROID_NATIVE_API_LEVEL=19
set ANDROID_PLATFORM=android-29
set BUILD_TYPE=Release
set GENERATOR="Ninja"

if not exist build md build
cd build

@REM build armeabi-v7a
if not exist %abi% md %abi%
cd %abi%

%ANDROID_SDK_CMAKE%/bin/cmake ^
  -DANDROID_ABI=%abi% ^
  -DANDROID_NDK=%ANDROID_NDK_HOME% ^
  -DCMAKE_BUILD_TYPE=%BUILD_TYPE% ^
  -DCMAKE_TOOLCHAIN_FILE=%ANDROID_NDK_HOME%/build/cmake/android.toolchain.cmake ^
  -DANDROID_PLATFORM=%ANDROID_PLATFORM% ^
  -DANDROID_NATIVE_API_LEVEL=%ANDROID_NATIVE_API_LEVEL% ^
  -DANDROID_TOOLCHAIN=clang ^
  -DCMAKE_GENERATOR=%GENERATOR% ^
  -DCMAKE_MAKE_PROGRAM=%ANDROID_SDK_CMAKE%/bin/ninja ^
  ../../

%ANDROID_SDK_CMAKE%/bin/ninja

cd ../../

在以上内容中我们需要配置ANDROID_SDKANDROID_NDK、以及所使用CMake的路径,上面的路径需要根据自己的路径进行修改。

整个项目结构如下

build_android.bat
CMakeLists.txt
main.cpp

然后在该目录直接点击运行build_android.bat批处理文件,如果一切编译顺利的话则会出现以下的日志信息

C:\Users\Admin\Desktop\Android Cmake Test\build\arm64-v8a>F:/Software/Android/AndroidSDK/SDK/cmake/3.22.1/bin/cmake   -DANDROID_ABI=arm64-v8a   -DANDROID_NDK=F:/Software/Android/AndroidSDK/SDK/ndk/25.1.8937393   -DCMAKE_BUILD_TYPE=Release   -DCMAKE_TOOLCHAIN_FILE=F:/Software/Android/AndroidSDK/SDK/ndk/25.1.8937393/build/cmake/android.toolchain.cmake   -DANDROID_PLATFORM=android-29   -DANDROID_NATIVE_API_LEVEL=19   -DANDROID_TOOLCHAIN=clang   -DCMAKE_GENERATOR="Ninja"   -DCMAKE_MAKE_PROGRAM=F:/Software/Android/AndroidSDK/SDK/cmake/3.22.1/bin/ninja   ../../
-- The C compiler identification is Clang 14.0.6
-- The CXX compiler identification is Clang 14.0.6
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: F:/Software/Android/AndroidSDK/SDK/ndk/25.1.8937393/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: F:/Software/Android/AndroidSDK/SDK/ndk/25.1.8937393/toolchains/llvm/prebuilt/windows-x86_64/bin/clang++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/HuangWang/Desktop/Android Cmake Test/build/arm64-v8a

生成完成之后,如果我们在build_android.bat设置的abi为arm64-v8a,那么则会在该文件夹下创建一个build文件夹,在build文件夹下会创建一个arm64-v8a文件夹,里面为cmake目录,并且保存了编译完成的可执行程序。

3 验证交叉编译的可执行程序

将测试的Android手机通过USB数据线连接到电脑,这里需要在windows中配置adb环境,然后通过adb命令将交叉编译的可执行程序push到一个临时目录下,然后看是否可以执行成功,具体的命令如下

adb push ./arm64-v8a/android_corss_test /data/local/tmp
adb shell
cd /data/local/tmp
chmod 777 ./android_corss_test
./android_corss_test

执行完成之后看是否输出6,如果可执行成功并且输出正确结果6,则说明交叉编译成功。