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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:36:38