升级至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
相关产品推荐
相关产品推荐

