package jadex.application.space.envsupport.observer.graphics.opengl; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.jar.JarEntry; import java.util.jar.JarInputStream; /** * This class loads the native libraries for JOGL */ public class JOGLNativeLoader { public static final String LIBNAMES[] = {"gluegen-rt", "jogl", "jogl_awt"}; private static boolean loaded; /** * Loads the appropriate native libraries. */ public static void loadJOGLLibraries() { if(loaded) { return; } com.sun.gluegen.runtime.NativeLibLoader.disableLoading(); com.sun.opengl.impl.NativeLibLoader.disableLoading(); String system = System.getProperty("os.name"); String arch = System.getProperty("os.arch"); if(system.equals("Linux")) { if(arch.equals("i386")) { loadLinux32(); loaded = true; return; } if(arch.equals("amd64")) { loadLinux64(); loaded = true; return; } } if(system.startsWith("Windows")) { if(arch.equals("x86")) { loadWindows32(); loaded = true; return; } if(arch.equals("amd64")) { loadWindows64(); loaded = true; return; } } if(system.equals("Mac OS X")) { loadMacOSX(); loaded = true; return; } if(system.equals("SunOS")) { if(arch.equals("sparc")) { loadSolarisSparc(); loaded = true; return; } } loadError(); return; } /** * Loads the libraries for 32bit Linux. */ private static void loadLinux32() { loadUnix("linux32/"); } /** * Loads the libraries for 64bit Linux. */ private static void loadLinux64() { loadUnix("linux64/"); } /** * Loads the libraries for Solaris on 32bit Sparc. */ private static void loadSolarisSparc() { loadUnix("solarissparc/"); } /** * Generalized Unix library loader */ private static void loadUnix(String pathPrefix) { loadLibraries(pathPrefix, "lib", ".so"); } /** * Loads the libraries for 32bit Windows. */ private static void loadWindows32() { loadWindows("windows32/"); } /** * Loads the libraries for 64bit Windows. */ private static void loadWindows64() { loadWindows("windows64/"); } /** * Generalized Windows library loader */ private static void loadWindows(String pathPrefix) { loadLibraries(pathPrefix, "", ".dll"); } /** * Generalized Mac OS X library loader */ private static void loadMacOSX() { String pathPrefix = "macosxuni/"; loadLibraries(pathPrefix, "lib", ".jnilib"); } private static void loadLibraries(String libPath, String prefix, String suffix) { // Stupid workaround to force Java to load awt-support... try { System.loadLibrary("jawt"); } catch (UnsatisfiedLinkError e) { } for(int i = 0; i < LIBNAMES.length; ++i) { String path = libPath + prefix + LIBNAMES[i] + suffix; ClassLoader cl = Thread.currentThread().getContextClassLoader(); String pckg = JOGLNativeLoader.class.getPackage().getName() .replaceAll("\\.", "/"); URL libJarSrc = cl.getResource(pckg + "/nativelibs.jar"); if(libJarSrc == null) { loadError(); } InputStream libStream = null; try { JarInputStream jis = new JarInputStream(libJarSrc.openStream()); JarEntry entry = null; do { entry = jis.getNextJarEntry(); } while(!entry.getName().equals(path)); libStream = jis; } catch(Exception e) { loadError(); } File tmpLib = null; try { String tmpDir = System.getProperty("java.io.tmpdir"); tmpLib = new File(tmpDir + File.separator + prefix + LIBNAMES[i] + suffix); FileOutputStream tmpOut = new FileOutputStream(tmpLib); byte[] buf = new byte[4096]; int len = 0; while((len = libStream.read(buf)) != -1) { tmpOut.write(buf, 0, len); } libStream.close(); tmpOut.close(); } catch(IOException e) { } } for(int i = 0; i < LIBNAMES.length; ++i) { String tmpDir = System.getProperty("java.io.tmpdir"); File libFile = new File(tmpDir + File.separator + prefix + LIBNAMES[i] + suffix); System.load(libFile.getAbsolutePath()); } } private static void loadError() { throw new RuntimeException("Failed to identify operating system and" + " load JOGL libraries."); } }