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

Android Gradle构建CMake项目测试被忽略及JRTPLIB集成编译报错

Android Gradle集成JRTPLIB的完整解决方案(含CMake测试与ifaddrs问题修复)

我帮你梳理了针对这两个问题的具体解决步骤,同时给出Gradle集成JRTPLIB的标准方案:

一、Gradle中正确集成JRTPLIB的配置

首先把JRTPLIB源码放到你项目的src/main/cpp/jrtplib目录下,然后按以下步骤配置:

  1. 配置app模块的build.gradle
    在android代码块中添加externalNativeBuild配置,指定CMake路径和版本:

    android {
        // ...其他配置
        externalNativeBuild {
            cmake {
                path "src/main/cpp/CMakeLists.txt"
                version "3.22.1" // 选择与你的NDK兼容的CMake版本,建议3.18+
            }
        }
        defaultConfig {
            // ...其他配置
            externalNativeBuild {
                cmake {
                    // 指定目标架构,按需调整
                    abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
                    // 添加编译宏,提前告知JRTPLIB环境信息
                    arguments "-DJRTPLIB_HAVE_IFADDRS=1", "-DJRTPLIB_BUILD_EXAMPLES=OFF"
                }
            }
        }
    }
    
  2. 编写CMakeLists.txt
    在src/main/cpp/CMakeLists.txt中引入JRTPLIB并链接到你的原生库:

    cmake_minimum_required(VERSION 3.18.1)
    
    project(your-native-lib)
    
    # 关闭JRTPLIB的示例和测试编译,避免不必要的构建问题
    set(JRTPLIB_BUILD_EXAMPLES OFF)
    set(JRTPLIB_BUILD_TESTS OFF)
    
    # 手动指定JRTPLIB所需的系统特性,跳过可能失效的CMake自动检测
    set(JRTPLIB_HAVE_IFADDRS 1)
    set(JRTPLIB_HAVE_SOCKADDR_IN6 1)
    set(JRTPLIB_HAVE_GETADDRINFO 1)
    set(JRTPLIB_HAVE_PTHREAD 1)
    
    # 引入JRTPLIB子项目
    add_subdirectory(jrtplib)
    
    # 构建你的原生库
    add_library(your-native-lib SHARED your-native-code.cpp)
    
    # 链接依赖库
    target_link_libraries(your-native-lib
        jrtplib
        pthread
        android
        log
    )
    

二、修复CMake测试被忽略的问题

Android交叉编译环境下,JRTPLIB自带的CMake检测逻辑(比如检查函数、头文件是否存在)经常会失效,导致测试被忽略,进而引发编译错误。解决核心是跳过自动检测,手动指定JRTPLIB需要的编译宏:

  • 在CMakeLists.txt中添加上述的set(JRTPLIB_HAVE_XXX 1)系列配置,直接告知JRTPLIB当前环境支持的特性
  • 关闭JRTPLIB的测试编译(set(JRTPLIB_BUILD_TESTS OFF)),避免测试代码因环境不兼容导致的问题

三、修复ifaddrs缺失的编译错误

Android API Level 24以下的系统没有提供ifaddrs.h和相关函数,分两种情况处理:

情况1:支持API Level 24及以上

直接在build.gradle的defaultConfig中设置:

defaultConfig {
    minSdkVersion 24
    // ...其他配置
}

此时系统自带ifaddrs相关接口,无需额外处理。

情况2:需要兼容API Level 24以下

添加ifaddrs的兼容实现:

  1. 把ifaddrs.c和ifaddrs.h放到src/main/cpp/compat目录下
  2. 在CMakeLists.txt中添加兼容库:
    # 添加ifaddrs兼容库
    add_library(ifaddrs-compat STATIC src/main/cpp/compat/ifaddrs.c)
    target_include_directories(ifaddrs-compat PUBLIC src/main/cpp/compat)
    
    # 链接到原生库
    target_link_libraries(your-native-lib
        ifaddrs-compat
        jrtplib
        pthread
        android
        log
    )
    

这样就能解决系统库不支持ifaddrs的问题了。

内容的提问来源于stack exchange,提问作者PPP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:21:33