diff --git a/jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java b/jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java index 5d286d83e..988fde4ba 100644 --- a/jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java +++ b/jme3-desktop/src/main/java/com/jme3/system/NativeLibraryLoader.java @@ -435,9 +435,19 @@ public final class NativeLibraryLoader { + "library to: " + targetFile); } } finally { - // Not sure if we always want to load it. - // Maybe specify this as a per library setting. - System.load(targetFile.getAbsolutePath()); + // XXX: HACK. Vary loading method based on library name.. + // lwjgl and jinput handle loading by themselves. + if (name.equals("lwjgl")) { + System.setProperty("org.lwjgl.librarypath", + extactionDirectory.getAbsolutePath()); + } else if (name.equals("jinput")) { + System.setProperty("net.java.games.input.librarypath", + extactionDirectory.getAbsolutePath()); + } else { + // all other libraries (openal, bulletjme, custom) + // will load directly in here. + System.load(targetFile.getAbsolutePath()); + } if(in != null){ try { in.close(); } catch (IOException ex) { } diff --git a/jme3-examples/src/main/java/jme3test/app/TestNativeLoader.java b/jme3-examples/src/main/java/jme3test/app/TestNativeLoader.java index c8642ff9d..c7abf249f 100644 --- a/jme3-examples/src/main/java/jme3test/app/TestNativeLoader.java +++ b/jme3-examples/src/main/java/jme3test/app/TestNativeLoader.java @@ -32,9 +32,7 @@ package jme3test.app; import com.jme3.system.NativeLibraryLoader; -import com.jme3.util.JmeFormatter; -import java.util.logging.ConsoleHandler; -import java.util.logging.Handler; +import java.io.File; import java.util.logging.Level; import java.util.logging.Logger; @@ -45,13 +43,114 @@ import java.util.logging.Logger; */ public class TestNativeLoader { - public static void main(String[] args) { - Logger.getLogger("").getHandlers()[0].setLevel(Level.ALL); - Logger.getLogger("").setLevel(Level.ALL); - + private static final File WORKING_FOLDER = new File(System.getProperty("user.dir")); + + private static void tryLoadLwjgl() { NativeLibraryLoader.loadNativeLibrary("lwjgl", true); + System.out.println("Succeeded in loading LWJGL.\n\tVersion: " + + org.lwjgl.Sys.getVersion()); + } + + private static void tryLoadJinput() { NativeLibraryLoader.loadNativeLibrary("jinput", true); + + net.java.games.input.ControllerEnvironment ce = + net.java.games.input.ControllerEnvironment.getDefaultEnvironment(); + if (ce.isSupported()) { + net.java.games.input.Controller[] c = + ce.getControllers(); + + System.out.println("Succeeded in loading JInput.\n\tVersion: " + + net.java.games.util.Version.getVersion()); + } + } + + private static void tryLoadOpenAL() { NativeLibraryLoader.loadNativeLibrary("openal", true); - NativeLibraryLoader.loadNativeLibrary("bulletjme", false); + + try { + org.lwjgl.openal.AL.create(); + String renderer = org.lwjgl.openal.AL10.alGetString(org.lwjgl.openal.AL10.AL_RENDERER); + String vendor = org.lwjgl.openal.AL10.alGetString(org.lwjgl.openal.AL10.AL_VENDOR); + String version = org.lwjgl.openal.AL10.alGetString(org.lwjgl.openal.AL10.AL_VERSION); + System.out.println("Succeeded in loading OpenAL."); + System.out.println("\tVersion: " + version); + } catch (org.lwjgl.LWJGLException ex) { + throw new RuntimeException(ex); + } finally { + if (org.lwjgl.openal.AL.isCreated()) { + org.lwjgl.openal.AL.destroy(); + } + } + } + + private static void tryLoadOpenGL() { + org.lwjgl.opengl.Pbuffer pb = null; + try { + pb = new org.lwjgl.opengl.Pbuffer(1, 1, new org.lwjgl.opengl.PixelFormat(0, 0, 0), null); + pb.makeCurrent(); + String version = org.lwjgl.opengl.GL11.glGetString(org.lwjgl.opengl.GL11.GL_VERSION); + System.out.println("Succeeded in loading OpenGL.\n\tVersion: " + version); + } catch (org.lwjgl.LWJGLException ex) { + throw new RuntimeException(ex); + } finally { + if (pb != null) { + pb.destroy(); + } + } + } + + private static void tryLoadBulletJme() { + if (NativeLibraryLoader.isUsingNativeBullet()) { + NativeLibraryLoader.loadNativeLibrary("bulletjme", true); + + com.jme3.bullet.PhysicsSpace physSpace = new com.jme3.bullet.PhysicsSpace(); + com.jme3.bullet.PhysicsSpace.initNativePhysics(); + + System.out.println("Succeeded in loading BulletJme."); + } else { + System.out.println("Native bullet not included. Cannot test loading."); + } + } + + private static void cleanupNativesFolder(File folder) { + for (File file : folder.listFiles()) { + String lowerCaseName = file.getName().toLowerCase(); + if (lowerCaseName.contains("lwjgl") || + lowerCaseName.contains("jinput") || + lowerCaseName.contains("openal") || + lowerCaseName.contains("bulletjme")) { + file.delete(); + } + } + } + + public static void main(String[] args) { + Logger.getLogger("").getHandlers()[0].setLevel(Level.WARNING); + Logger.getLogger(NativeLibraryLoader.class.getName()).setLevel(Level.ALL); + + // Get a bit more output from LWJGL about issues. + // System.setProperty("org.lwjgl.util.Debug", "true"); + + // Extracting to working folder is no brainer. + // Choose some random path, then load LWJGL. + File customNativesFolder = new File("CustomNativesFolder"); + customNativesFolder.mkdirs(); + + if (!customNativesFolder.isDirectory()) { + throw new IllegalStateException("Failed to make custom natives folder"); + } + + // Let's cleanup our folders first. + cleanupNativesFolder(WORKING_FOLDER); + cleanupNativesFolder(customNativesFolder); + + NativeLibraryLoader.setCustomExtractionFolder(customNativesFolder.getAbsolutePath()); + + tryLoadLwjgl(); + tryLoadOpenGL(); + tryLoadOpenAL(); + tryLoadJinput(); + tryLoadBulletJme(); } }