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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 07:04:17