Android库中CMake引入外部原生项目无法打包进AAR的问题
解决Android AAR打包ExternalProject构建的共享库问题
核心问题
Android Gradle插件(AGP)只会自动追踪CMake中直接构建的目标库,或者明确标记为需要导出的导入库。你当前的IMPORTED库没有被AGP识别为要打包的产物,而且Gradle默认不会触发ExternalProject_Add的构建任务,除非有其他目标依赖它。
解决方案
1. 修正CMake配置,让AGP识别导入库
修改你的CMake代码,给导入库添加导出标记,并通过空接口库建立依赖关联:
ExternalProject_Add( spatialite URL https://www.gaia-gis.it/gaia-sins/libspatialite-5.0.1.tar.gz CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env ${CMAKE_CURRENT_SOURCE_DIR}/build/spatialite-prefix/src/spatialite/configure BUILD_IN_SOURCE 1 # 用CMAKE_BINARY_DIR替代硬编码路径,适配不同构建环境 BUILD_BYPRODUCTS ${CMAKE_BINARY_DIR}/spatialite-prefix/src/spatialite/src/.libs/mod_spatialite.so ) add_library(mod_spatialite SHARED IMPORTED GLOBAL) add_dependencies(mod_spatialite spatialite) set_target_properties(mod_spatialite PROPERTIES IMPORTED_LOCATION "${CMAKE_BINARY_DIR}/spatialite-prefix/src/spatialite/src/.libs/mod_spatialite.so" # 关键:告诉AGP该库需要被导出到AAR ANDROID_LIBRARY_EXPORTED_NAME "mod_spatialite" ) # 创建空接口库作为桥梁,让Gradle触发CMake构建任务 add_library(android_native_bridge INTERFACE) target_link_libraries(android_native_bridge INTERFACE mod_spatialite)
2. 配置Gradle,明确触发构建并打包
在Android库模块的build.gradle中,指定CMake目标并确保Gradle能找到生成的库:
android { defaultConfig { externalNativeBuild { cmake { arguments "-DANDROID_STL=c++_shared" // 根据spatialite需求调整STL版本 targets "android_native_bridge" // 关联CMake中的接口库 } } } externalNativeBuild { cmake { path "CMakeLists.txt" version "3.22.1" // 匹配你的本地CMake版本 } } // 确保Gradle能找到生成的共享库并打包 sourceSets { main { jniLibs.srcDirs += "${buildDir}/intermediates/cmake/release/obj/${abi}" } } }
3. 验证构建结果
执行./gradlew assembleRelease,解压生成的AAR文件,检查jni/<abi>/目录下是否存在libmod_spatialite.so。如果未找到,查看CMake构建日志,确认spatialite任务已执行且库文件生成路径正确。
关键细节说明
ANDROID_LIBRARY_EXPORTED_NAME:AGP识别导入库的核心属性,明确标记该库需要被包含进AARGLOBAL关键字:让导入库在整个CMake项目中可见,确保接口库能正确建立依赖- 接口库作用:如果你的Android库没有自有原生代码,通过空接口库触发Gradle执行CMake构建流程
内容的提问来源于stack exchange,提问作者fafre
相关产品推荐
相关产品推荐

