diff options
author | Sven Gothel <[email protected]> | 2011-09-21 20:52:10 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2011-09-21 20:52:10 +0200 |
commit | def691b009132463f8ec8efabd0d72768235dcf5 (patch) | |
tree | 574ce12a6bd1ff12b93faaac70c36f3dc5256364 /src | |
parent | 0e44b330403011558391c732a0b6240694ecb6a1 (diff) |
Unify JNI Library Loading into JNILibLoaderBase and use it for the gluegen-rt native lib as well
- removed redundance
- move proper JNLPAppletLauncher custom libloader code into JNILibLoaderBase
- prepares for new JAR temp cache ..
Diffstat (limited to 'src')
10 files changed, 104 insertions, 152 deletions
diff --git a/src/java/com/jogamp/common/jvm/JNILibLoaderBase.java b/src/java/com/jogamp/common/jvm/JNILibLoaderBase.java index 2ad0504..161f0c4 100644 --- a/src/java/com/jogamp/common/jvm/JNILibLoaderBase.java +++ b/src/java/com/jogamp/common/jvm/JNILibLoaderBase.java @@ -106,7 +106,7 @@ public class JNILibLoaderBase { } } - private static final HashSet loaded = new HashSet(); + private static final HashSet<String> loaded = new HashSet<String>(); private static LoaderAction loaderAction = new DefaultAction(); public static boolean isLoaded(String libName) { @@ -145,30 +145,41 @@ public class JNILibLoaderBase { } } - private static final Class customLauncherClass; + // private static final Class<?> customLauncherClass; private static final Method customLoadLibraryMethod; // FIXME centralize logging static { - Class launcherClass = null; + final String sunAppletLauncherProperty = "sun.jnlp.applet.launcher"; + final String sunAppletLauncherClassName = "org.jdesktop.applet.util.JNLPAppletLauncher"; + final boolean usingJNLPAppletLauncher = Boolean.valueOf(System.getProperty(sunAppletLauncherProperty)).booleanValue(); + + Class<?> launcherClass = null; Method loadLibraryMethod = null; - if ( Debug.getBooleanProperty("sun.jnlp.applet.launcher", false, localACC) ) { + if (usingJNLPAppletLauncher) { try { - launcherClass = Class.forName("org.jdesktop.applet.util.JNLPAppletLauncher"); - loadLibraryMethod = launcherClass.getDeclaredMethod("loadLibrary", new Class[] { String.class }); - } catch (ClassNotFoundException ex) { - if(DEBUG) { - ex.printStackTrace(); - } - } catch (NoSuchMethodException ex) { - if(DEBUG) { - ex.printStackTrace(); - } - launcherClass = null; + launcherClass = Class.forName(sunAppletLauncherClassName); + } catch (ClassNotFoundException cnfe) { + // oops .. look like JNLPAppletLauncher doesn't exist, despite property + // this may happen if a previous applet was using JNLPAppletLauncher in the same JVM + System.err.println("JNILibLoaderBase: <"+sunAppletLauncherClassName+"> not found, despite enabled property <"+sunAppletLauncherProperty+">, JNLPAppletLauncher was probably used before"); + System.setProperty(sunAppletLauncherProperty, Boolean.FALSE.toString()); + } catch (LinkageError le) { + throw le; + } + if(null != launcherClass) { + try { + loadLibraryMethod = launcherClass.getDeclaredMethod("loadLibrary", new Class[] { String.class }); + } catch (NoSuchMethodException ex) { + if(DEBUG) { + ex.printStackTrace(); + } + launcherClass = null; + } } } - + if(null==launcherClass) { String launcherClassName = Debug.getProperty("jnlp.launcher.class", false, localACC); if(null!=launcherClassName) { @@ -187,8 +198,7 @@ public class JNILibLoaderBase { } } } - - customLauncherClass = launcherClass; + // customLauncherClass = launcherClass; customLoadLibraryMethod = loadLibraryMethod; } diff --git a/src/java/com/jogamp/common/jvm/JVMUtil.java b/src/java/com/jogamp/common/jvm/JVMUtil.java index 8657ae8..9ad9baf 100644 --- a/src/java/com/jogamp/common/jvm/JVMUtil.java +++ b/src/java/com/jogamp/common/jvm/JVMUtil.java @@ -37,7 +37,7 @@ import com.jogamp.common.nio.Buffers; import com.jogamp.common.os.NativeLibrary; import jogamp.common.Debug; -import com.jogamp.gluegen.runtime.NativeLibLoader; +import com.jogamp.gluegen.runtime.GlueGenJNILibLoader; /** * Currently this tool works around the Hotspot race condition bugs: @@ -54,7 +54,7 @@ public class JVMUtil { private static final boolean DEBUG = Debug.debug("JVMUtil"); static { - NativeLibLoader.loadGlueGenRT(); + GlueGenJNILibLoader.loadGlueGenRT(); ByteBuffer buffer = Buffers.newDirectByteBuffer(64); if( ! initialize(buffer) ) { diff --git a/src/java/com/jogamp/common/nio/AbstractBuffer.java b/src/java/com/jogamp/common/nio/AbstractBuffer.java index 1d99767..90e31f8 100644 --- a/src/java/com/jogamp/common/nio/AbstractBuffer.java +++ b/src/java/com/jogamp/common/nio/AbstractBuffer.java @@ -32,7 +32,7 @@ package com.jogamp.common.nio; import com.jogamp.common.os.*; -import com.jogamp.gluegen.runtime.NativeLibLoader; +import com.jogamp.gluegen.runtime.GlueGenJNILibLoader; import java.nio.Buffer; import java.nio.ByteBuffer; @@ -49,7 +49,7 @@ public abstract class AbstractBuffer<B extends AbstractBuffer> implements Native protected int position; static { - NativeLibLoader.loadGlueGenRT(); + GlueGenJNILibLoader.loadGlueGenRT(); } /** diff --git a/src/java/com/jogamp/common/nio/PointerBuffer.java b/src/java/com/jogamp/common/nio/PointerBuffer.java index 27a0bc6..d2691d9 100644 --- a/src/java/com/jogamp/common/nio/PointerBuffer.java +++ b/src/java/com/jogamp/common/nio/PointerBuffer.java @@ -39,7 +39,7 @@ import java.nio.LongBuffer; import com.jogamp.common.os.NativeLibrary; import com.jogamp.common.os.Platform; import com.jogamp.common.util.LongObjectHashMap; -import com.jogamp.gluegen.runtime.NativeLibLoader; +import com.jogamp.gluegen.runtime.GlueGenJNILibLoader; /** * Hardware independent container for native pointer arrays. @@ -55,7 +55,7 @@ public class PointerBuffer extends AbstractBuffer<PointerBuffer> { protected LongObjectHashMap dataMap = null; static { - NativeLibLoader.loadGlueGenRT(); + GlueGenJNILibLoader.loadGlueGenRT(); } /** no backup array, use for direct usage only */ diff --git a/src/java/com/jogamp/common/os/DynamicLibraryBundle.java b/src/java/com/jogamp/common/os/DynamicLibraryBundle.java index 23e1714..b7e0739 100755 --- a/src/java/com/jogamp/common/os/DynamicLibraryBundle.java +++ b/src/java/com/jogamp/common/os/DynamicLibraryBundle.java @@ -250,7 +250,7 @@ public class DynamicLibraryBundle implements DynamicLookupHelper { boolean ignoreError = true; boolean res; try { - res = GlueJNILibLoaderBase.loadLibrary(libName, ignoreError); + res = GlueJNILibLoader.loadLibrary(libName, ignoreError); if(DEBUG && !res) { System.err.println("Info: Could not load JNI/Glue library: "+libName); } @@ -339,7 +339,7 @@ public class DynamicLibraryBundle implements DynamicLookupHelper { } /** Inherit access */ - static class GlueJNILibLoaderBase extends JNILibLoaderBase { + static class GlueJNILibLoader extends JNILibLoaderBase { protected static synchronized boolean loadLibrary(String libname, boolean ignoreError) { return JNILibLoaderBase.loadLibrary(libname, ignoreError); } diff --git a/src/java/com/jogamp/common/os/NativeLibrary.java b/src/java/com/jogamp/common/os/NativeLibrary.java index beee639..c8dfdf1 100755 --- a/src/java/com/jogamp/common/os/NativeLibrary.java +++ b/src/java/com/jogamp/common/os/NativeLibrary.java @@ -41,7 +41,7 @@ package com.jogamp.common.os; import com.jogamp.common.util.IOUtil; -import com.jogamp.gluegen.runtime.NativeLibLoader; +import com.jogamp.gluegen.runtime.GlueGenJNILibLoader; import jogamp.common.Debug; import jogamp.common.os.MacOSXDynamicLinkerImpl; import jogamp.common.os.UnixDynamicLinkerImpl; @@ -175,7 +175,7 @@ public class NativeLibrary implements DynamicLookupHelper { if (DEBUG) { System.err.println("Trying to load " + path); } - NativeLibLoader.loadGlueGenRT(); + GlueGenJNILibLoader.loadGlueGenRT(); long res; if(global) { res = dynLink.openLibraryGlobal(path, DEBUG); diff --git a/src/java/com/jogamp/gluegen/runtime/GlueGenJNILibLoader.java b/src/java/com/jogamp/gluegen/runtime/GlueGenJNILibLoader.java new file mode 100755 index 0000000..4f281df --- /dev/null +++ b/src/java/com/jogamp/gluegen/runtime/GlueGenJNILibLoader.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2011 JogAmp Community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of Sun Microsystems, Inc. or the names of + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN + * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR + * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR + * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE + * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF + * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for use + * in the design, construction, operation or maintenance of any nuclear + * facility. + * + * Sun gratefully acknowledges that this software was originally authored + * and developed by Kenneth Bradley Russell and Christopher John Kline. + */ + +package com.jogamp.gluegen.runtime; + +import java.security.*; + +import com.jogamp.common.jvm.JNILibLoaderBase; + +/** Class providing control over whether GlueGen loads the native code + associated with the NativeLibrary implementation. Alternative app + launchers such as those running within applets may want to disable + this default loading behavior and load the native code via another + (manual) mechanism. */ +public class GlueGenJNILibLoader extends JNILibLoaderBase { + + public static void loadGlueGenRT() { + AccessController.doPrivileged(new PrivilegedAction<Object>() { + public Object run() { + loadLibrary("gluegen-rt", false); + return null; + } + }); + } +} diff --git a/src/java/com/jogamp/gluegen/runtime/NativeLibLoader.java b/src/java/com/jogamp/gluegen/runtime/NativeLibLoader.java deleted file mode 100755 index 9e56d37..0000000 --- a/src/java/com/jogamp/gluegen/runtime/NativeLibLoader.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. - * Copyright (c) 2011 JogAmp Community. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * - Redistribution of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistribution in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * This software is provided "AS IS," without a warranty of any kind. ALL - * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, - * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN - * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR - * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR - * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR - * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR - * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE - * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, - * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF - * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed or intended for use - * in the design, construction, operation or maintenance of any nuclear - * facility. - * - * Sun gratefully acknowledges that this software was originally authored - * and developed by Kenneth Bradley Russell and Christopher John Kline. - */ - -package com.jogamp.gluegen.runtime; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.security.*; - -/** Class providing control over whether GlueGen loads the native code - associated with the NativeLibrary implementation. Alternative app - launchers such as those running within applets may want to disable - this default loading behavior and load the native code via another - (manual) mechanism. */ -public class NativeLibLoader { - private static volatile boolean loadingEnabled = true; - private static volatile boolean didLoading; - - public static void disableLoading() { - loadingEnabled = false; - } - - public static void enableLoading() { - loadingEnabled = true; - } - - public static void loadGlueGenRT() { - if (!didLoading && loadingEnabled) { // volatile: ok - synchronized (NativeLibLoader.class) { - if (!didLoading && loadingEnabled) { - didLoading = true; - AccessController.doPrivileged(new PrivilegedAction<Object>() { - public Object run() { - loadLibraryInternal("gluegen-rt"); - return null; - } - }); - } - } - } - } - - private static void loadLibraryInternal(String libraryName) { - final String sunAppletLauncherProperty = "sun.jnlp.applet.launcher"; - final String sunAppletLauncherClassName = "org.jdesktop.applet.util.JNLPAppletLauncher"; - final boolean usingJNLPAppletLauncher = Boolean.valueOf(System.getProperty(sunAppletLauncherProperty)).booleanValue(); - - if (usingJNLPAppletLauncher) { - Class<?> jnlpAppletLauncherClass = null; - try { - jnlpAppletLauncherClass = Class.forName(sunAppletLauncherClassName); - } catch (ClassNotFoundException cnfe) { - // oops .. look like JNLPAppletLauncher doesn't exist, despite property - // this may happen if a previous applet was using JNLPAppletLauncher in the same JVM - System.err.println("NativeLibLoader: <"+sunAppletLauncherClassName+"> not found, despite enabled property <"+sunAppletLauncherProperty+">, JNLPAppletLauncher was probably used before"); - System.setProperty(sunAppletLauncherProperty, Boolean.FALSE.toString()); - } catch (LinkageError le) { - throw le; - } - if(null != jnlpAppletLauncherClass) { - try { - Method jnlpLoadLibraryMethod = jnlpAppletLauncherClass.getDeclaredMethod("loadLibrary", new Class[] { String.class }); - jnlpLoadLibraryMethod.invoke(null, new Object[] { libraryName }); - return; // done - } catch (Exception e) { - Throwable t = e; - if (t instanceof InvocationTargetException) { - t = ((InvocationTargetException) t).getTargetException(); - } - if (t instanceof Error) { - throw (Error) t; - } - if (t instanceof RuntimeException) { - throw (RuntimeException) t; - } - // Throw UnsatisfiedLinkError for best compatibility with System.loadLibrary() - throw (UnsatisfiedLinkError) new UnsatisfiedLinkError().initCause(e); - } - } - } - System.loadLibrary(libraryName); - } -} diff --git a/src/java/jogamp/common/os/MachineDescriptionRuntime.java b/src/java/jogamp/common/os/MachineDescriptionRuntime.java index eeb2c1b..c555724 100644 --- a/src/java/jogamp/common/os/MachineDescriptionRuntime.java +++ b/src/java/jogamp/common/os/MachineDescriptionRuntime.java @@ -32,7 +32,7 @@ import com.jogamp.common.os.MachineDescription; import com.jogamp.common.os.NativeLibrary; import com.jogamp.common.os.Platform; import com.jogamp.common.os.MachineDescription.StaticConfig; -import com.jogamp.gluegen.runtime.NativeLibLoader; +import com.jogamp.gluegen.runtime.GlueGenJNILibLoader; /** * Runtime MachineDescription @@ -85,7 +85,7 @@ public class MachineDescriptionRuntime { } private static MachineDescription getRuntimeImpl() { try { - NativeLibLoader.loadGlueGenRT(); + GlueGenJNILibLoader.loadGlueGenRT(); } catch (UnsatisfiedLinkError err) { return null; } diff --git a/src/junit/com/jogamp/gluegen/test/junit/generation/BindingJNILibLoader.java b/src/junit/com/jogamp/gluegen/test/junit/generation/BindingJNILibLoader.java index 12bdf7f..5fc2df7 100644 --- a/src/junit/com/jogamp/gluegen/test/junit/generation/BindingJNILibLoader.java +++ b/src/junit/com/jogamp/gluegen/test/junit/generation/BindingJNILibLoader.java @@ -34,7 +34,7 @@ import java.security.*; public class BindingJNILibLoader extends JNILibLoaderBase { public static void loadBindingtest1p1() { - AccessController.doPrivileged(new PrivilegedAction() { + AccessController.doPrivileged(new PrivilegedAction<Object>() { public Object run() { loadLibrary("Bindingtest1p1", null, true); return null; @@ -43,7 +43,7 @@ public class BindingJNILibLoader extends JNILibLoaderBase { } public static void loadBindingtest1p2() { - AccessController.doPrivileged(new PrivilegedAction() { + AccessController.doPrivileged(new PrivilegedAction<Object>() { public Object run() { loadLibrary("Bindingtest1p2", null, true); return null; |