使用 NDK 交叉构建 Android 应用

在此示例中,我们将了解如何将 Conan 包交叉构建到 Android 平台。

首先,从下载页面下载 Android NDK 并解压。在 MacOS 上,您也可以使用 brew install android-ndk 安装。

然后进入 Conan 配置主目录下的 profiles 文件夹(通过运行 conan config home 查看),并创建一个名为 android 的文件,内容如下:

include(default)

[settings]
# Just an example, you need to use your real settings
os=Android
os.api_level=21
arch=armv8
compiler=clang
compiler.version=12
compiler.libcxx=c++_shared
compiler.cppstd=14

[conf]
# Use your path here
tools.android:ndk_path=/usr/local/share/android-ndk

您可能需要修改:

  • compiler.version: 查看 NDK 文档或查找包含编译器可执行文件(如 x86_64-linux-android31-clang)的 bin 文件夹。在 Macos 安装中,它位于 NDK 路径 + toolchains/llvm/prebuilt/darwin-x86_64/bin。运行 ./x86_64-linux-android31-clang --version 来检查正在运行的 clang 版本并调整配置文件。

  • compiler.libcxx: 支持的值是 c++_staticc++_shared

  • compiler.cppstd: C++ 标准版本,根据您的需求调整。

  • os.api_level: 您可以在此处查看每个 Android 版本/API 级别的使用情况,并选择最适合您需求的。这通常是新功能和更兼容的应用程序之间的平衡。

  • arch: Android 支持多种架构:x86x86_64armv7armv8

  • tools.android:ndk_path 配置: 写入解压后的 NDK 位置。

如果您在 Windows 上,则需要一个类似于 make 的构建系统,例如 MinGW-Make 或 Ninja。我们可以在配置文件中直接使用 [tool_requires] 为 Ninja 提供支持。

...
[conf]
# Use your path here
tools.android:ndk_path=C:\ws\android\android-ndk-r23b
tools.cmake.cmaketoolchain:generator=Ninja

[tool_requires]
ninja/[*]

使用 conan new 命令创建一个“Hello World”C++ 库示例项目

$ conan new cmake_lib -d name=hello -d version=1.0

然后我们可以指定 android 配置文件,我们的 hello 库将为 Android 构建。

$ conan create . --profile android

[ 50%] Building CXX object CMakeFiles/hello.dir/src/hello.cpp.o
[100%] Linking CXX static library libhello.a
[100%] Built target hello
...
[ 50%] Building CXX object CMakeFiles/example.dir/src/example.cpp.o
[100%] Linking CXX executable example
[100%] Built target example

库和 test_package 可执行文件都是为 Android 构建的,因此我们无法在本地计算机上使用它们。

除非您有权访问 root 权限的 Android 设备,否则无法直接运行测试应用程序或使用构建的库,因此更常见的是构建一个使用 hello 库的 Android 应用程序。

也可以从 Conan tool-requires 中使用 android-ndk。ConanCenter 中已经有一个包含 AndroidNDK 的 Conan 包,因此可以编写如下配置文件:

[settings]
os=Android
os.api_level=21
arch=armv8
compiler=clang
compiler.version=18
compiler.libcxx=c++_shared
compiler.cppstd=14
build_type=Release

# You might need Ninja conf and tool-requires in Windows too
[tool_requires]
android-ndk/[*]

这将自动从 ConanCenter 下载最新的 android-ndk,并自动注入和应用它来构建包。请注意,为了在生产环境中使用 ConanCenter 的包,建议采用以下方法

另请参阅