LWJGL AWTGLCanvas.render()触发NoSuchMethodError问题求助
解决Windows下LWJGL3+LWJGL3-AWT的NoSuchMethodError问题
问题现象
在Windows 11环境下,使用LWJGL 3.3.6和lwjgl3-awt 0.1.8运行OpenGL代码时,调用canvas.render()抛出以下异常:
Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: 'short org.lwjgl.system.windows.User32.RegisterClassEx(org.lwjgl.system.windows.WNDCLASSEX)' at org.lwjgl.opengl.awt.PlatformWin32GLCanvas.createDummyWindow(PlatformWin32GLCanvas.java:134) at org.lwjgl.opengl.awt.PlatformWin32GLCanvas.create(PlatformWin32GLCanvas.java:154) at org.lwjgl.opengl.awt.AWTGLCanvas.beforeRender(AWTGLCanvas.java:60) at org.lwjgl.opengl.awt.AWTGLCanvas.render(AWTGLCanvas.java:101) at com.myCompany.GLTest$2.run(GLTest.java:52)
相同配置在Linux环境下可正常运行。
问题原因分析
- XML语法错误导致依赖版本异常:pom.xml中
lwjgl3-awt.version属性的闭合标签写错,导致lwjgl3-awt的版本未被正确设置为0.1.8。 - 缺少Windows系统依赖的Native库:lwjgl3-awt在Windows下需要调用
User32等系统API,对应的lwjgl-system模块Native库未被显式引入。 - 不必要的GLFW初始化冲突:代码中在AWT OpenGL上下文内调用
glfwInit(),属于冗余操作且可能引发上下文冲突。
解决方案
1. 修复pom.xml的版本属性错误
找到properties中的lwjgl3-awt.version配置,修正闭合标签:
<properties> <!-- 其他属性保持不变 --> <lwjgl3-awt.version>0.1.8</lwjgl3-awt.version> </properties>
2. 添加lwjgl-system的Native依赖
在dependencies节点中添加Windows下需要的lwjgl-system Native库:
<dependencies> <!-- 已有依赖保持不变 --> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-system</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> </dependencies>
3. 移除代码中的冗余GLFW初始化
修改initGL()方法,删除不必要的glfwInit()调用:
@Override public void initGL() { createCapabilities(); glClearColor(0.3f, 0.4f, 0.5f, 1); }
4. 额外优化:调整窗口初始化顺序
原代码中先设置窗口可见再添加画布,可能导致渲染异常,建议调整顺序:
JFrame wnd = new JFrame(); wnd.setLayout(new BorderLayout()); wnd.setPreferredSize(new Dimension(500, 500)); wnd.add(canvas); // 先添加画布 wnd.pack(); wnd.setVisible(true); // 再设置可见 wnd.transferFocus();
验证
完成上述修改后,重新编译运行代码,Windows环境下的NoSuchMethodError应该会消失,画布可以正常渲染指定的背景色。
内容的提问来源于stack exchange,提问作者noen
相关产品推荐
相关产品推荐

