Android NDK中如何通过CMakeLists.txt输出预构建依赖库?
解决Android NDK CMake导出预构建库的问题
嘿,我来帮你搞定这个问题!你已经成功把预构建的pre-lib链接到自研库mylib了,现在要让pre-lib.so也跟着mylib.so一起输出对吧?这里有几种实用的CMake方案,按需选择就行:
方法一:构建后自动复制预构建库到输出目录
NDK默认不会自动把导入的预构建库复制到最终输出目录(比如app/build/intermediates/cmake/debug/obj/<abi>/),我们可以用add_custom_command在mylib构建完成后手动复制:
# 获取当前构建的ABI架构(比如arm64-v8a、armeabi-v7a) get_property(CURRENT_ABI TARGET mylib PROPERTY ANDROID_ABI) # 获取预构建库pre-lib的实际路径 get_target_property(PRE_LIB_FULL_PATH pre-lib IMPORTED_LOCATION) # 添加构建后命令:把pre-lib.so复制到mylib.so所在的目录 add_custom_command(TARGET mylib POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${PRE_LIB_FULL_PATH} $<TARGET_FILE_DIR:mylib>/pre-lib.so COMMENT "Copied pre-lib.so to output directory for ${CURRENT_ABI}" )
这样每次构建完mylib,pre-lib.so都会出现在和mylib.so相同的目录下,后续打包APK时就能自动包含进去。
方法二:用install命令统一管理输出(适合需要安装到指定路径的场景)
如果你的项目需要通过make install把库安装到特定目录,用install命令更规范:
# 获取pre-lib的路径 get_target_property(PRE_LIB_PATH pre-lib IMPORTED_LOCATION) # 安装pre-lib到指定的库目录 install(FILES ${PRE_LIB_PATH} DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT runtime ) # 同时安装自研库mylib install(TARGETS mylib LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT runtime )
执行install操作时,两个库会被同步安装到CMAKE_INSTALL_LIBDIR指定的路径下,方便后续分发或集成。
额外注意事项
- 如果你有多个ABI版本的
pre-lib.so,CMake会根据当前构建的ANDROID_ABI自动匹配对应的库,上面的代码会自动适配这个逻辑,不用额外修改。 - 要确保
get_target_property能正确获取到pre-lib的路径,也就是你之前set_target_properties里的IMPORTED_LOCATION设置是正确的。
内容的提问来源于stack exchange,提问作者CoXier
相关产品推荐
相关产品推荐

