升级Android NDK r17后模块编译失败:MIPS/armeabi不再支持
很多开发者都遇到过你这个问题——NDK r17开始正式移除了对armeabi、MIPS和MIPS64这几个ABI的支持,所以当你的项目还在配置这些架构时,CMake工具链就会抛出你看到的那些错误。
问题根源
Google在NDK r17的发布说明里明确宣布,因为这些架构的市场占比极低,且维护成本高,所以停止对它们的支持。CMake的android.toolchain.cmake脚本会直接校验ABI的有效性,不允许使用已废弃的架构,进而导致编译器路径无法正确设置,引发后续的CMAKE_C_COMPILER和CMAKE_CXX_COMPILER未设置的连锁错误。
可行的解决办法
你可以试试下面这些步骤,大概率能解决问题:
更新项目的ABI配置
在你的Android模块的build.gradle文件中,修改ndk块里的abiFilters,只保留NDK r17支持的架构:android { defaultConfig { ndk { abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } } }如果你的项目直接用CMakeLists.txt指定架构,也要修改
CMAKE_ANDROID_ARCH_ABI的设置,移除armeabi、mips、mips64相关的配置。检查第三方依赖库
如果你项目里引用了第三方的原生库(.so文件),要确认这些库是否提供了上述支持的ABI版本。如果第三方库还只提供废弃的ABI,你需要联系库的开发者更新,或者寻找替代方案。清理编译缓存
有时候旧的缓存会导致配置不生效,执行以下命令清理缓存后再重新编译:./gradlew clean
关于回退到r16b的说明
回退到r16b确实能暂时解决问题,但这只是权宜之计。后续的NDK版本会彻底移除对这些废弃ABI的支持,而且旧版本NDK不会再接收安全补丁更新,长期来看建议尽快迁移到支持的架构。
内容的提问来源于stack exchange,提问作者Antonio Oliva

