2014-11-22 81 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