LWJGL2→LWJGL3 兼容层

基本信息

属性 值
主兼容包 org.lwjglx
手写 shim 文件数 138
自动生成 shim 文件数 258
生成的哑类文件数(org/lwjgl) 182
定制重定向类数 6(me.eigenraven.lwjgl3ify.redirects)
生成器源码 src/util/java/me/eigenraven/lwjgl3ify/(4 个类)

LWJGL3ify 的体量主要在这里:不是游戏内容,而是一整套把 LWJGL2 API 调用翻译到 LWJGL3 的代码。

功能

两类 org/lwjglx 兼容代码

来源 目录 文件数 内容
手写 src/main/java/org/lwjglx/ 138 人工维护的兼容实现
自动生成 src/generated/java/org/lwjglx/ 258 由 src/util/java 下的生成器产出

共 396 个文件。README 的描述是"A partially auto-generated compatibility shim redirecting lwjgl2 api calls into the matching lwjgl3 calls",并指出生成器在 src/util/java。

生成器 4 个类:

类 职责
JarApiSet 描述 LWJGL2 / LWJGL3 两套 jar 的 API 集合
MethodMatcher 方法签名匹配
MethodRedirector 生成重定向方法体
ComparisonTool 比对生成结果,入口 main(build.gradle.kts:347)

build.gradle.kts:369-372 显示比对任务把 LWJGL2 与 LWJGL3 的 classpath 分别喂给 ComparisonTool,逐项传入 --2: / --3: / --M: 参数。

182 个 org/lwjgl 哑类

src/generated/java/org/lwjgl/ 下 182 个文件是占位桩,不是 LWJGL2 的完整实现。README 说明:“Dummy org/lwjgl/* classes matching the classes removed from lwjgl3 (e.g. Display) for mods that rely on finding them under that location in the classpath - e.g. for mixin metadata”。

典型例子:org/lwjgl/opengl/Display.java——LWJGL3 移除了 Display 窗口类,但很多 mod 的 mixin 目标元数据里写着 org.lwjgl.opengl.Display,找不到类就无法解析 mixin 目标,故保留同名空壳。

同目录下还有 LWJGLException、LWJGLUtil 及其内部类 LWJGLUtil$TokenFilter、BufferChecks、MemoryUtil、PointerWrapper / PointerWrapperAbstract、Sys,以及 input/(Controller、Controllers、Cursor、Keyboard、Mouse)与 openal/(ALCcontext、ALCdevice、EFX10、EFXUtil、OpenALException、Util)两个子包。

6 个定制重定向类

src/main/java/me/eigenraven/lwjgl3ify/redirects/ 共 6 个类,每个都有已核实的消费方:

类 消费方 说明
Pack200 LwjglRedirectTransformer 前缀表 Java 8 java.util.jar.Pack200 的重定向目标(LwjglRedirectTransformer.java:38)。类注释:“Redirection class for Java 8’s java.util.jar.Pack200 classes”
LiteLoaderClassPathUtilities 同上前缀表 LiteLoader ClassPathUtilities 的重定向(:39)
InvalidActivityException 同上前缀表 javax.activity.InvalidActivityException 的重定向(:40),类签名 extends java.rmi.RemoteException
JarInputStream ForgePatchTransformer 被 tfClassPatchManager 注入为新 owner(ForgePatchTransformer.java:106),绕开新 JDK 对 jar: 协议 URL 的限制
ProgressBar ForgePatchTransformer 被 tfProgressBar 注入(ForgePatchTransformer.java:280)
Desktop 4 个 openurl mixin 4 个 MixinGuiXxx 用 @ModifyConstant 把 java.awt.Desktop 换成它(各文件第 17-18 行)

ProgressBar 内还有一个 public static final class ClientAccess(ProgressBar.java:15)。

OpenAL 兼容性修补

CommonProxy.runCompatHooks() 反射读取 COFHAccessTransformer 的 superClasses 映射,把 org/lwjgl/openal/OpenALException 与 org/lwjglx/openal/OpenALException 的父类强制改为 java/lang/RuntimeException(CommonProxy.java:14-19)。注释说明动机是"Fix crash with OpenComputers/COFHCore due to a class extending OpenALException"。

注意它同时处理 org/lwjgl/ 与 org/lwjglx/ 两个包名——前者是 LWJGL2 原始路径,后者是 LWJGL3ify 自己的 shim 包。

数值

数值 值 来源
org/lwjglx 手写文件 138 git ls-files 'src/main/java/org/lwjglx/*'
org/lwjglx 生成文件 258 git ls-files 'src/generated/java/org/lwjglx/*'
org/lwjglx 合计 396 上两行相加
org/lwjgl 哑类 182 git ls-files 'src/generated/java/org/lwjgl/*'
redirects 类 6 git ls-files 'src/main/java/.../redirects/*'
生成器类 4 git ls-files 'src/util/*'
非 lwjglx/lwjgl 的主源码文件 79 git ls-files 'src/main/java/**' 中 org/lwjglx 之外的计数
仓库跟踪文件总数 717 git ls-files | wc -l

已知静默失败点

redirects 与 LwjglRedirectTransformer 的失败策略见 RFB 字节码转换器 的"交互"一节:转换失败只打 WARN,该类以未转换状态继续加载。

交互

触发 行为
mod 调用 LWJGL2 API 字节码中的 org/lwjgl/ 前缀被重定向到 org/lwjglx/
mod 的 mixin 目标写 org.lwjgl.opengl.Display 由哑类占位,保证 mixin 元数据可解析
mod 访问已从 JRE 移除的 javax.xml.bind 重定向到 jakarta.xml.bind(该包在 jar 中 shade 并被类加载器排除)
mod 使用 LiteLoader ClassPathUtilities 重定向到本仓库实现(README 声明需 Midnight145 的 LiteloaderLoader)
同时装了 OpenComputers 与 COFHCore 修补 OpenALException 继承关系避免崩溃

相关条目