如何用Gradle+NDK编译存在二进制依赖的两个项目?
解决方案:Gradle中链接已编译完成的JRTPLIB二进制库
我之前也碰到过一模一样的需求——不想把依赖库的源码硬塞进主项目里,而是直接链接已经编译好的二进制文件,既能省编译时间,还能保持项目结构清爽。下面给你两种实操性强的方案,你可以根据自己的工具偏好来选:
第一步:先固定JRTPLIB的编译输出路径
首先得把原来的JRTPLIB Gradle配置调整一下,让它的头文件和库文件输出到一个固定目录,这样后续新源码能准确找到它们。修改你的JRTPLIB模块的build.gradle:
externalNativeBuild { cmake { path "../../JRTPLIB/CMakeLists.txt" // 指定库文件输出目录,按CPU架构分类 arguments "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=${project.rootDir}/jrtplib-build/libs/\${ANDROID_ABI}" // 指定头文件输出目录 arguments "-DCMAKE_INCLUDE_OUTPUT_DIRECTORY=${project.rootDir}/jrtplib-build/include" } }
执行一次JRTPLIB的编译,你就能在项目根目录的jrtplib-build文件夹下看到分好类的头文件和库文件了。
方案一:用CMake编译新源码并链接JRTPLIB
如果你的新源码还是想用CMake管理,那就在新源码的CMakeLists.txt里添加链接配置:
# 引入JRTPLIB的头文件,让编译器能找到对应的声明 include_directories(${PROJECT_SOURCE_DIR}/../../jrtplib-build/include) # 指定JRTPLIB库文件的存放路径 link_directories(${PROJECT_SOURCE_DIR}/../../jrtplib-build/libs/${ANDROID_ABI}) # 编译你的新源码为共享库(或可执行文件) add_library(your_new_shared_lib SHARED src/main/cpp/your_core_code.cpp src/main/cpp/another_file.cpp ) # 链接JRTPLIB库到你的新库 target_link_libraries(your_new_shared_lib jrtplib # 这里要和JRTPLIB编译出来的库名一致,比如静态库可能是libjrtplib.a )
然后在新模块的build.gradle里配置externalNativeBuild指向这个CMake脚本,同时确保架构匹配:
android { defaultConfig { ndk { abiFilters 'armeabi-v7a', 'arm64-v8a' // 和JRTPLIB编译的架构保持一致 } } externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" // 你的新CMake脚本路径 arguments "-DANDROID_ABI=${android.defaultConfig.ndk.abiFilters[0]}" } } } # 可选:如果JRTPLIB是单独的Gradle模块,添加依赖确保它先编译 dependencies { implementation project(':jrtplib-module') }
方案二:直接用Gradle NDK配置链接(适合简单源码)
如果你的新源码只有几个文件,不想折腾CMake,可以直接用Gradle的ndkBuild配置:
android { defaultConfig { ndk { abiFilters 'armeabi-v7a', 'arm64-v8a' } } externalNativeBuild { ndkBuild { // 指定你的新源码文件 sources "src/main/cpp/your_source_code.cpp" // 添加JRTPLIB的头文件目录 include "../../jrtplib-build/include" // 链接对应的JRTPLIB库文件 ldLibs "../../jrtplib-build/libs/${android.defaultConfig.ndk.abiFilters[0]}/libjrtplib.so" } } }
注意事项
- 一定要保证编译架构完全匹配:JRTPLIB编译的ABI要和新源码的
abiFilters一致,不然会出现链接错误。 - 如果JRTPLIB是静态库(
.a文件),链接时要注意顺序,把静态库放在依赖链的末端。 - 如果你是跨平台编译(比如Windows/Linux/macOS),只需要调整库文件的后缀和路径即可,逻辑是一样的。
内容的提问来源于stack exchange,提问作者PPP
相关产品推荐
相关产品推荐

