Creating jars(including LWJGL)

Hi,
So, I use netbeans. If I’m using just the JDK, when I want to run my file ad if it is dirtbuted, I just go to the ‘dist’ folder in my project folder, douldble click the jar and it works perfect.

When I am using other libraries, in this case LWJGL, its not so simple. If I run from the command line  java -jar "dist directory/myjar.jar" I get 

Exception in thread “main” java.lang.UnsatisfiedLinkError: no lwjgl in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1709)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1030)
at org.lwjgl.Sys$1.run(Sys.java:72)
at java.security.AccessController.doPrivileged(Native Method)
at org.lwjgl.Sys.doLoadLibrary(Sys.java:65)
at org.lwjgl.Sys.loadLibrary(Sys.java:81)
at org.lwjgl.Sys.(Sys.java:98)
at Zero2.Zero.(Zero.java:49)
Could not find the main class: Zero2.Zero. Program will exit.

Which is the same as if I didn’t have -Djava.library.path=My LWJGL dll directory in netbeans run classpath. Soo, I add that to my command line to try and run
Java -Djava.library.path=My LWJGL dll directory -jar “dist directory/myjar.jar”, And it works fine.
So pretty sure its just to do with packing the dll’s into the jar.
I have searched forums and google’d it a few diff ways and cant seem to solve the problem. I’ve tried adding tehe dll’s to diff directories inside the .jar, also just leaving them in the same directory as the jar. Nothing seems to work.

Maybe there is a way of declaring where the dll’s are in the manifest? I mean
Java -Djava.library.path=My LWJGL dll directory -jar “dist directory/myjar.jar”
works fine as a test on my system, but if I wanted to just give the prgram to somone as an executable file, thats not really gonna be good if i have to pack the dlls and tell them to run it via the command line and put a path to them.

Sorry If I coulda explained this in a faster way…

Hope I can get a solution to this.

Thanks in advance

Del

Hi Del!

I tried to do this as well, but the final outcome of my investigations is: You just can’t. One reason I found on the net was that .jar’s are supposed to contain platform-independend files - and the .dll or .so aren’t. But the real reason seems to be, that you can’t reference the dll directory in the jar file for the shared library-loader.

Maybe you can extract the dll files from the jar during runtime (using a static {} block in the main class where the dll files are written to a temp dir? But his seems to become a security issue) and then load them from your app dynamically using Runtime.loadLibrary()? But I didn’t tried that yet… if you find a working solution please let me know :slight_smile:

Stefan

have you checked this thread http://lwjgl.org/forum/index.php/topic,2748 ?

Thanks Matzon, I did try a some of the sugestions on that thread, couldn’t seem to get them working.

I ended up putting the dll’s in the windows system 32 directory for now, just a quick fix.(I think some comercial programs place their dll’s in that directory on installation anyways?

Also I have seen another thread on LWJGL forums that suggest Jsmooth, kinda tired now but had a quick browse and it looks like a nice program for packing java app’s.

Don’t do that! You could break all LWJGL games on the same system if you start dropping things into there.

I just use JSmooth - then you can hardcode the (relative) path to the dlls in a sub dir and the user gets a nice familiar exe. Really easy to do too.

Ok, I deleted them all from the system directory, hope they havent done any damage to the system while they were there. I’ll check out Jsmooth.

Thanks