Android NDK搭配CMake时如何实现APP_ABI:=all等效配置
Android NDK+CMake 配置全CPU架构.so编译方案
在CMake构建体系下要实现和ndk-build中APP_ABI := all完全一致的全架构动态库编译效果,对应CMake 3.18.1版本可按以下两种场景配置:
方案一:Android项目结合Gradle构建(推荐,和Android Studio流程适配)
这是日常Android开发最常用的配置方式,不需要修改CMakeLists.txt文件,直接在对应模块(通常为app模块)的build.gradle(Groovy语法)中添加配置即可:
android { defaultConfig { ndk { // 等价于ndk-build的APP_ABI := all // 会自动编译当前使用的NDK版本支持的所有非废弃CPU架构 abiFilters 'all' } // 原有externalNativeBuild/cmake块配置保持不变即可,不需要额外修改 externalNativeBuild { cmake { cppFlags "" // 其他原有参数保留 } } } }
如果你用的是Kotlin DSL的build.gradle.kts,对应配置写法为:
android { defaultConfig { ndk { abiFilters += "all" } } }
配置完成后同步项目,执行构建时就会自动产出所有支持架构的.so文件,默认包含的架构和APP_ABI := all完全一致:
- armeabi-v7a
- arm64-v8a
- x86
- x86_64
方案二:纯命令行直接调用CMake构建
如果脱离Gradle直接用命令行执行CMake交叉编译,注意单次CMake构建只能产出单个目标ABI的产物,不存在一次配置生成所有ABI.so的写法,需要为每个目标ABI单独创建构建目录,分别执行配置、编译流程,最后汇总产物即可。
以编译arm64-v8a架构为例,命令参考如下:
# 创建对应架构的独立构建目录,避免不同架构的构建缓存冲突 mkdir -p build/arm64-v8a && cd build/arm64-v8a # 执行CMake配置,传入NDK工具链和目标ABI参数 cmake -DCMAKE_TOOLCHAIN_FILE=$NDK_PATH/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=arm64-v8a \ -DANDROID_PLATFORM=android-21 \ ../../ # 执行编译 cmake --build .
对剩下的3个架构,重复上述流程,仅需要把-DANDROID_ABI的参数值替换为对应架构名,最后将各构建目录生成的.so文件按ABI名分目录存放即可。
注意事项
- 不要尝试在CMakeLists.txt内部通过
set(ANDROID_ABI all)实现全架构编译,ANDROID_ABI是工具链文件在配置初始阶段读取的参数,在CMakeLists中赋值时机过晚,不仅不会生效还会引发架构配置冲突 - CMake 3.18.1版本对NDK全ABI构建的支持已经稳定,不存在版本兼容问题,不需要额外升降级CMake版本
- 如果需要裁剪架构,只需要把
abiFilters后面的all替换成需要的架构名即可,比如abiFilters 'arm64-v8a', 'armeabi-v7a'就只会生成这两个架构的.so文件
内容的提问来源于stack exchange,提问作者Sujith S Manjavana
相关产品推荐
相关产品推荐

