Android Gradle构建CMake项目测试被忽略及JRTPLIB集成编译报错
Android Gradle集成JRTPLIB的完整解决方案(含CMake测试与ifaddrs问题修复)
我帮你梳理了针对这两个问题的具体解决步骤,同时给出Gradle集成JRTPLIB的标准方案:
一、Gradle中正确集成JRTPLIB的配置
首先把JRTPLIB源码放到你项目的src/main/cpp/jrtplib目录下,然后按以下步骤配置:
配置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" } } } }编写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的兼容实现:
- 把
ifaddrs.c和ifaddrs.h放到src/main/cpp/compat目录下 - 在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
相关产品推荐
相关产品推荐

