Android NDK 支持使用 ndk-build 和 cmake 进行编译
移除不需要的 ABI
build.gradle.kts
android {
defaultConfig {
ndk {
abiFilters += listOf("x86_64")
}
}
}
CMake
CMake 变量
ANDROID_HOST_TAG
主机标记 可以用于查找对应主机的工具链
NDK 操作系统变体 | 主机标记 |
---|---|
macOS | darwin-x86_ |
Linux | linux-x86_ |
64 位 Windows | windows-x86_ |
CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN
NDK 工具链路径,不含 /bin,例如 ~/Android/Sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64
ANDROID_TOOLCHAIN_ROOT
${CMAKE_ANDROID_NDK}/toolchains/llvm/prebuilt/${ANDROID_HOST_TAG}
NDK 工具链路径,不含 /bin,例如 ~/Android/Sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/linux-x86_64
集成外部项目
可以使用 CMake ExternalProject 模块集成外部项目,下方有集成 OpenSSL 的例子
集成 OpenSSL
可以通过 CMake 的 ExternalProject 模块添加外部源码进行编译
ExternalProject_Add(openssl_project
GIT_REPOSITORY https://github.com/openssl/openssl.git
GIT_TAG ${OPENSSL_VERSION}
GIT_SHALLOW true
CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env PATH=${ANDROID_TOOLCHAIN_ROOT}/bin:$ENV{PATH} CC=${CMAKE_C_COMPILER} ANDROID_NDK_ROOT=${ANDROID_NDK} perl <SOURCE_DIR>/Configure android-${ANDROID_ARCH_NAME} -D__ANDROID_API__=${ANDROID_NATIVE_API_LEVEL} --openssldir=${CMAKE_LIBRARY_OUTPUT_DIRECTORY} --libdir="" --prefix=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
BUILD_COMMAND ${CMAKE_COMMAND} -E env PATH=${ANDROID_TOOLCHAIN_ROOT}/bin:$ENV{PATH} ANDROID_NDK_ROOT=${ANDROID_NDK} make
BUILD_BYPRODUCTS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libssl.so ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libcrypto.so
BUILD_IN_SOURCE true
)
也可以通过 Prefab 方式引入,Prefab 可以将 A 项目中的 .so 和 .h 引入到 B项目中
https://gist.github.com/rhulha/3a2bce7dc3d43c4bab8a14a31feecc38
或者手动编译 prebuilt
Windows 编译
不要使用 windows 原生工具链进行ndk编译,可以使用 wsl/msys 方案,推荐 wsl 或原生 Linux 使用 x11 转发 android studio 进行开发。当然也可以进行 prebuilt ,这样可以提高项目编译速度。
https://github.com/openssl/openssl/blob/openssl-3.0.13/Configurations/15-android.conf#L106
# see if there is NDK clang on $PATH, "universal" or "standalone"
if (which("clang") =~ m|^$ndk/.*/prebuilt/([^/]+)/|) {
my $host=$1;
其中 which 函数调用的 perl 函数 IPC::Cmd::can_run 在 windows 下会返回反斜杠和8.3文件名,导致正则表达式无法匹配 参考 StackOverflow