CMake 4.0.1 误用/usr/local/include的JNI头文件而非$JAVA_HOME版本求助
解决方案:CMake 4.x 强制使用指定JDK的JNI头文件
问题分析
CMake 4.0.1 在 macOS 上执行时,尽管成功定位到 JAVA_HOME 下的 OpenJDK 21,但 find_package(JNI) 仍优先选取了 /usr/local/include 下的 JDK 1.8 头文件。这是因为新版本 CMake 的 FindJNI 模块调整了查找优先级,未自动关联 FindJava 定位到的目标JDK路径。
具体修复步骤
1. 手动指定JNI头文件路径(替代自动查找)
在 find_package(JNI) 之前添加以下代码,直接从 JAVA_HOME 提取正确的JNI头文件路径,跳过系统默认查找流程:
# 从JAVA_HOME手动获取macOS平台的JNI头文件路径 set(JNI_INCLUDE_DIRS "${JAVA_HOME}/include" "${JAVA_HOME}/include/darwin" ) # 标记JNI已找到,跳过自动查找 set(JNI_FOUND TRUE)
2. 将JNI路径添加到目标的包含目录
确保你的共享库目标能访问到JNI头文件,修改 target_include_directories 部分:
target_include_directories(java_cpp_binding PUBLIC src/main/cpp/include PUBLIC ${jni_bind_f_SOURCE_DIR} PUBLIC ${DataModel_SOURCE_DIR} PUBLIC ${JNI_INCLUDE_DIRS} # 新增:加入JNI头文件路径 )
3. (可选)强制关联FindJava的JDK路径
如果希望保留 find_package(JNI) 的自动查找逻辑,可在 find_package(Java) 前添加以下代码,明确指定JAVA相关路径:
# 强制设置JAVA_INCLUDE路径为目标JDK的目录 set(JAVA_INCLUDE_PATH "${JAVA_HOME}/include") set(JAVA_INCLUDE_PATH2 "${JAVA_HOME}/include/darwin")
验证修改
重新执行CMake配置,查看打印的变量:
JNI_INCLUDE_DIRS应显示为${JAVA_HOME}/include和${JAVA_HOME}/include/darwin- 编译时检查头文件引用,确认使用的是OpenJDK 21的JNI头文件而非1.8版本
内容的提问来源于stack exchange,提问作者rkesters
相关产品推荐
相关产品推荐

