A Game in one jar file

I’ve wiritten a very simple game using jogl, and I won’t to put all the files in one jar (resources, jogl classes, my classes, jogl natives), so there’s no playing with jre needed for the user. My game loads classes and resources correctly from the jar, but the jre doesn’t see the natives? Is there a solution?

Thanks in advance!

You could write platform specific installers to unpack the files. Alternatively you could use Webstart. The native dll’s still have to go in separate jars, but the user only has to only click on a link to get the whole lot to load.

What about -Djava.libarypath how can I set it for a jar, maybe an example…

I don’t think you can set it in the manifest.

This might be worth trying, although you still need to know where the dlls are stored. There’s some code at the bottom. No clue whether it works though.
http://forum.java.sun.com/thread.jspa?threadID=627890&tstart=0

Also see thread
http://192.18.37.44/forums/index.php?topic=4933.0

I tried the second thread with putting the libs in the same folder as jogl.jar and my game jar and the jvm says it cant find main class.

That is something that needs to go in the manifest

e.g.


Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.2
Created-By: 1.4.2_08-b03 (Sun Microsystems Inc.)
Main-Class: pianoplayer.Main

For example: Netbeans IDE doesn’t add the Main-Class attribute for you. You need to do it yourself.

Placing the libraries next to the jar works because on some platforms the working directory is in the default search path for dynamic libraries. IIRC under linux for instance java.library.path gets initialised to the current value of the LD_LIBRARY_PATH environment variable which may or may not contain ‘.’.
Here’s a wild idea that might be useful. The main problem that can’t really be worked around is that the underlying OS can’t load dynamic libraries that are located inside a jar. So what you could do is pack the library inside your jar and extract it to some temporary location just before you want to load it.
In pseudo code you could do the following

// Find the library in the jar
String libName = "myLibrary";
String sysLibName = System.mapLibraryName(libName);
InputStream libIS = getClass().getClassLoader().getResourceAsStream(sysLibName);

// Create a temp file
File tempFile = new File(System.getProperty("java.io.tmpdir") + File.seperator + sysLibName);
FileOutputStream tempFileOS = new FileOutputStream(tempFile);

// Copy from libIS to tempFileOS
....

// Load the lib
Runtime.load(tempFile.getAbsolutePath());

Then of course jogl would have to ignore the fact that it can’t load the library itself. Another potential pitfall is that mapLibraryName will probably return libjogl.so for both linux and solaris for instance, so you would need a way to distiguish between the two (possible using the os.name, os.arch, os.version system properties). This stuff is untested, unproven and there are probably many many other issues with this that I’m missing, but it’s worth a try :smiley:

Ok problem fixed I had to add to manifest:
Class-Path: ./jogl.jar
Thanks anyways!