2014-11-22 80 views
4

我试图安装使用LWJGL版本3中的IntelliJ一个新项目,我只是尝试了这个example:每当我尝试运行它, 我拿到引起的java.lang.NullPointerException在加载一个java.lang.ExceptionInInitializerError图书馆。NullPointerException异常与LWJGL 3初始化

我的当地人都在project_root/lib目录/ LWJGL /本地/ MacOSX的/ 64,所以我的虚拟机的说法是:
-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 

回答

3

解决的办法是指定一个绝对路径java.library.path,而不是相对的。

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

lightbringerwrites :

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弄糊涂了,但是,你知道,对于我们这些可怜的程序员来说,这是一个艰难的生活!

+0

哇。非常感谢!这让我疯狂。但他们为什么改变它(因为在lwjgl 2中有相对路径)? – tobs 2014-11-22 16:55:49

+1

@tobs我无法告诉你。当前的LWJGL源程序在搜索库时使用'System.load()'并遍历'java.library.path'中的路径名。我不知道LWJGL 2的行为是什么。 – 2014-11-22 16:57:23