我正在尝试使用 LWJGL 版本 3 在 IntelliJ 中设置一个新项目。我刚刚尝试了这个 example : 每当我尝试运行它时,
我在加载库时收到由 java.lang.NullPointerException
引起的 java.lang.ExceptionInInitializerError
。
我的 natives 在 project_root/lib/lwjgl/native/macosx/x64,所以我的 vm 参数是:
-Djava.library.path=lib/lwjgl/native/macosx/x64
我还将 lwjgl 添加到类路径中。
堆栈跟踪是:
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
最佳答案
解决方案是为 java.library.path
指定一个绝对路径,而不是相对路径。
在 LWJGL 论坛上,there was a user with a similar problem (我通过搜索 the problematic line 并在论坛上搜索找到了它)。对话的相关部分是:
lightbringer writes:
I think I figured it out. In LWJGLUtil.java I took out some code and ran it from my main()`. I got an
java.lang.UnsatisfiedLinkError: Expecting an absolute path of the library: lib/native\lwjgl.dll`
inside loadLibrary(). System.load() apparently needs an absolute path but you are passing it a relative path.
I tested with -Djava.library.path=E:\Dropbox\private\projects\solariad\redist\lib\native and this indeed did work as expected.
问题的根源是 LWJGL 使用 System.load()
,这本身没有问题,但它确实需要它加载的库的绝对路径名(另请参见 source)。
如果你看一下LWJGLUtil.java (尽管撰写本文时的版本与您的堆栈跟踪不完全对应)和 Sys.doLoadLibrary()
,您可以看到它尝试通过遍历 java.library.path
中的所有路径字符串、附加库名称并尝试 System.load()
来加载库在那些路径上。由于 load()
需要绝对路径,这意味着 java.library.path
也必须包含 LWJGL 库的绝对路径。
不幸的是,问题的根本原因被 NPE 弄糊涂了,但是,你知道,对于我们这些可怜的程序员来说,这是一个艰苦的生活!
关于java - 带有 LWJGL 3 初始化的 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27079503/