You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 06:06:55