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

升级至Java 11后SCons构建失败问题求助(基于SCons 2.5.0)

解决SCons 2.5.0 + JDK11 javah生成头文件的命令格式问题

问题背景

当前环境:

  • SCons 2.5.0(待升级)
  • JDK从1.8切换至11.0.2
  • Eclipse版本更新为eclipse-rcp-2023-03-R-win32-x86_64
  • 已在..\project\_user\TESTEnv.ini配置JAVAH和ECLIPSE_PATH,构建脚本位于../project/TESTWKS/TESTFw/TESTKernel.m/SConscript.3dn

执行构建时,javah生成头文件报错:SCons生成的javac命令未带.java后缀,提示“类名仅在显式请求注解处理时被接受”。要求不修改/project/_build/scons/2.5.0/scons-local-2.5.0/SCons/Tool/javah.py中的JAVAHCOM。

原因分析

JDK 11已移除独立的javah工具,其生成JNI头文件的功能整合到javac的-h参数中。SCons 2.5.0内置的javah工具针对JDK8及更早版本设计,生成的命令格式未适配JDK11的新语法,导致传递类名而非.java文件路径时触发错误。

解决方案

方法1:在项目SConscript中覆盖环境变量

无需修改SCons自带工具脚本,直接在你的SConscript.3dn中调整当前构建环境的JAVAH相关参数:

# 获取或初始化构建环境
env = Environment()
# 加载javah工具后,覆盖变量适配JDK11
env.Tool('javah')
# 将JAVAH替换为javac(JDK11用javac -h代替javah)
env['JAVAH'] = env['JAVAC']
# 重新定义JAVAHCOM命令格式,确保使用-h参数指定头文件输出目录,且源文件为带.java后缀的路径
env['JAVAHCOM'] = '$JAVAH $JAVAHFLAGS -h ${TARGET.dir} $SOURCES'
# 确保传入的SOURCES是.java文件路径,而非类名
# 示例:生成头文件到include目录,源文件为YourClass.java
env.JavaH(target='include', source=['src/com/example/YourClass.java'])

方法2:自定义构建器替代内置JavaH

如果覆盖变量仍有问题,可以完全自定义一个适配JDK11的构建器:

def generate_jni_header(target, source, env):
    # 构造javac -h命令:javac -h 输出目录 源文件.java
    output_dir = str(target[0].dir)
    src_files = ' '.join([str(s) for s in source])
    cmd = f'{env["JAVAC"]} {env["JAVACFLAGS"]} -h {output_dir} {src_files}'
    return env.Execute(cmd)

# 注册自定义构建器
env['BUILDERS']['JavaH'] = Builder(action=generate_jni_header)

# 使用自定义构建器生成头文件
env.JavaH(target='include', source=['src/com/example/YourClass.java'])

这两种方法都不需要修改SCons自带的javah.py脚本,仅在项目本地的构建脚本中调整即可适配JDK11的语法要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 21:27:01