NullPointerException with LWJGL 3 Initialization

tobs

I'm trying to setup a new project in IntelliJ using LWJGL version 3. I just tried out this example: Whenever I try to run it, I get a java.lang.ExceptionInInitializerError caused by a java.lang.NullPointerException while loading the library.

My natives are in project_root/lib/lwjgl/native/macosx/x64, so my vm argument is:
-Djava.library.path=lib/lwjgl/native/macosx/x64
I have also added lwjgl to the classpath.

The stack trace is:

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
Jason C

The solution is to specify an absolute path for java.library.path, rather than a relative one.

On the LWJGL forums, there was a user with a similar problem (I found this by searching for the problematic line and doing some hunting on the forum). The relevant part of the conversation is:

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.


The root of the issue is LWJGL's use of System.load(), which is not problematic in itself, but it does requires an absolute path name to the libraries it loads (see source as well).

If you take a look at LWJGLUtil.java (although the version at the time of this writing does not correspond exactly to your stack trace) and Sys.doLoadLibrary(), you can see that it attempts to load libraries by going through all the path strings in java.library.path, appending the library name, and trying System.load() on those paths. Since load() requires an absolute path the implication is that java.library.path must contain the absolute path to the LWJGL libraries as well.

It is unfortunate that the root cause of the problem was muddled by the NPE but, you know, it's a hard knock life for us poor programmers!

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related