LWJGL 3 初始化时出现了NullPointerException错误

4
我正在尝试使用LWJGL 3版本在IntelliJ中设置一个新项目。我刚试用了这个 例子:每次我尝试运行它时,我都会得到一个由加载库引起的java.lang.NullPointerExceptionjava.lang.ExceptionInInitializerError

我的本地文件位于project_root/lib/lwjgl/native/macosx/x64,因此我的vm参数是:
-Djava.library.path=lib/lwjgl/native/macosx/x64
我还将lwjgl添加到classpath中。

堆栈跟踪如下:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at test.HelloWorld.execute(HelloWorld.java:18)
    at test.HelloWorld.main(HelloWorld.java:80)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: java.lang.NullPointerException
    at org.lwjgl.LWJGLUtil.loadLibrarySystem(LWJGLUtil.java:326)
    at org.lwjgl.Sys$1.run(Sys.java:36)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.lwjgl.Sys.<clinit>(Sys.java:33)
    ... 7 more
1个回答

3
解决方案是为java.library.path指定一个绝对路径,而不是相对路径。
在LWJGL论坛上,有一个用户遇到了类似的问题(我通过搜索有问题的那一行代码并在论坛上进行一些搜索找到了这个)。相关对话的部分如下: lightbringer 写道

我想我找到了解决方法。在LWJGLUtil.java中,我删除了一些代码并从我的main()函数中运行它。我得到了一个

java.lang.UnsatisfiedLinkError:期望库的绝对路径:lib/native\lwjgl.dll`

在loadLibrary()函数中。System.load()显然需要一个绝对路径,但你正在传递一个相对路径。

我使用-Djava.library.path=E:\Dropbox\private\projects\solariad\redist\lib\native进行测试,确实按预期工作。


问题的根源在于LWJGL使用了System.load(),这本身并不是问题,但它需要加载库的绝对路径名称(也可以参见source)。
如果你看一下LWJGLUtil.java(尽管本文写作时的版本不完全对应于您的堆栈跟踪),以及Sys.doLoadLibrary(),你会发现它试图通过遍历java.library.path中的所有路径字符串,添加库名称,并在这些路径上尝试System.load()来加载库。由于load()需要绝对路径,所以暗示是java.library.path也必须包含LWJGL库的绝对路径。

不幸的是,问题的根本原因被NPE搞混了,但是,你知道的,对于我们这些可怜的程序员来说,这是艰难的生活!


哇,非常感谢!这让我疯狂了。但是他们为什么要更改它(因为相对路径在lwjgl 2中有效)? - tobs
1
@tobs 我无法告诉你。当前的LWJGL源代码使用System.load()并在搜索库时遍历java.library.path中的路径名。我不知道LWJGL 2的行为是什么。 - Jason C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接