【问题标题】:NullPointerException with LWJGL 3 Initialization带有 LWJGL 3 初始化的 NullPointerException
【发布时间】:2014-11-22 16:13:48
【问题描述】:

我正在尝试使用 LWJGL 版本 3 在 IntelliJ 中设置一个新项目。我刚刚尝试了这个 example:每当我尝试运行它时, 我在加载库时收到由java.lang.NullPointerException 引起的java.lang.ExceptionInInitializerError

我的本​​地人在 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 lwjgl


    【解决方案1】:

    解决方案是为java.library.path 指定一个绝对路径,而不是相对路径。

    在 LWJGL 论坛上,there was a user with a similar problem(我通过搜索 the problematic line 并在论坛上进行了一些搜索找到了这个)。对话的相关部分是:

    光明使者 writes:

    我想我明白了。在 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 我不能告诉你。当前的 LWJGL 源使用 System.load() 并在搜索库时遍历 java.library.path 中的路径名。我不知道 LWJGL 2 的行为是什么。
    猜你喜欢
    • 2014-01-22
    • 1970-01-01
    • 2017-06-10
    • 2015-12-27
    • 2011-07-04
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多