diff options
author | Kenneth Russel <[email protected]> | 2006-04-17 08:24:48 +0000 |
---|---|---|
committer | Kenneth Russel <[email protected]> | 2006-04-17 08:24:48 +0000 |
commit | 081ce00eaad7568f5a651a34d0940feb5c9f9124 (patch) | |
tree | 3d7ba5cebe98f55bf2f10a7249e5c86c0ee20cfb | |
parent | 66035d8db744c3bebd8b4ba1979e3846fa79b24c (diff) |
Fixed Issue 215: Enhancement for NativeLibLoader
Incorporated patch largely unmodified from user s_koehler. Cleaned up
Cg library loading based on this work.
git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/svn-server-sync/jogl/trunk@720 232f8b59-042b-4e1e-8c03-345bb8c30851
-rwxr-xr-x | make/cg-common-CustomJavaCode.java | 17 | ||||
-rw-r--r-- | make/cg-common.cfg | 4 | ||||
-rw-r--r-- | src/classes/com/sun/opengl/impl/NativeLibLoader.java | 150 |
3 files changed, 93 insertions, 78 deletions
diff --git a/make/cg-common-CustomJavaCode.java b/make/cg-common-CustomJavaCode.java index ba0df4ee9..63afdb65d 100755 --- a/make/cg-common-CustomJavaCode.java +++ b/make/cg-common-CustomJavaCode.java @@ -1,20 +1,5 @@ static { - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - try { - // Workaround so that these don't need to be in the system - // path but can be referenced from java.library.path - // (this is intended to help with Webstarted applications) - System.loadLibrary("cg"); - System.loadLibrary("cgGL"); - } catch (UnsatisfiedLinkError e) { - // Consider this non-fatal - } - // Load the actual Cg binding - System.loadLibrary("jogl_cg"); - return null; - } - }); + NativeLibLoader.loadCgImpl(); } /** A convenience method which reads all available data from the InputStream and then calls cgCreateProgram. */ diff --git a/make/cg-common.cfg b/make/cg-common.cfg index f264fb2bf..6f73e7ed0 100644 --- a/make/cg-common.cfg +++ b/make/cg-common.cfg @@ -96,8 +96,8 @@ Ignore cgGetProgramOptions # Need to import New IO for Buffer classes # Import java.nio.* -# and java.security.* to allow unsigned Cg applications -Import java.security.* +# And NativeLibLoader for help loading the native libraries +Import com.sun.opengl.impl.* # Raise CgException instead of RuntimeException in glue code RuntimeExceptionType CgException diff --git a/src/classes/com/sun/opengl/impl/NativeLibLoader.java b/src/classes/com/sun/opengl/impl/NativeLibLoader.java index 9331b2f72..25c52e594 100644 --- a/src/classes/com/sun/opengl/impl/NativeLibLoader.java +++ b/src/classes/com/sun/opengl/impl/NativeLibLoader.java @@ -40,87 +40,117 @@ package com.sun.opengl.impl; import java.awt.Toolkit; -import java.security.*; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.util.HashSet; public class NativeLibLoader { - private static volatile boolean doLoading = true; + public interface LoaderAction { + /** + * Loads the library specified by libname. Optionally preloads the libraries specified by + * preload. The implementation should ignore, if the preload-libraries have already been + * loaded. + * @param libname the library to load + * @param preload the libraries to load before loading the main library + * @param doPreload true, iff the preload-libraries should be loaded + * @param ignoreError true, iff errors during loading the preload-libraries should be ignored + */ + void loadLibrary(String libname, String[] preload, + boolean doPreload, boolean ignoreError); + } + + private static class DefaultAction implements LoaderAction { + public void loadLibrary(String libname, String[] preload, + boolean doPreload, boolean ignoreError) { + if (doPreload) { + for (int i=0; i<preload.length; i++) { + try { + System.loadLibrary(preload[i]); + } + catch (UnsatisfiedLinkError e) { + if (!ignoreError && e.getMessage().indexOf("already loaded") < 0) { + throw e; + } + } + } + } + + System.loadLibrary(libname); + } + } + + private static final HashSet loaded = new HashSet(); + private static LoaderAction loaderAction = new DefaultAction(); public static void disableLoading() { - doLoading = false; + setLoadingAction(null); } public static void enableLoading() { - doLoading = true; + setLoadingAction(new DefaultAction()); + } + + public static synchronized void setLoadingAction(LoaderAction action) { + loaderAction = action; } - private static volatile boolean loadedCore = false; - private static volatile boolean loadedAWTImpl = false; - private static volatile boolean loadedDRIHack = false; - + private static synchronized void loadLibrary(String libname, String[] preload, + boolean doPreload, boolean ignoreError) { + if (loaderAction != null && !loaded.contains(libname)) + { + loaderAction.loadLibrary(libname, preload, doPreload, ignoreError); + loaded.add(libname); + } + } + public static void loadCore() { - if (doLoading && !loadedCore) { - synchronized (NativeLibLoader.class) { - if (!loadedCore) { - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - System.loadLibrary("jogl"); - return null; - } - }); - loadedCore = true; - } + AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + loadLibrary("jogl", null, false, false); + return null; } - } + }); } public static void loadAWTImpl() { - if (doLoading && !loadedAWTImpl) { - synchronized (NativeLibLoader.class) { - if (!loadedAWTImpl) { - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - boolean isOSX = System.getProperty("os.name").equals("Mac OS X"); - if (!isOSX) { - // Must pre-load JAWT on all non-Mac platforms to - // ensure references from jogl_awt shared object - // will succeed since JAWT shared object isn't in - // default library path - try { - System.loadLibrary("jawt"); - } catch (UnsatisfiedLinkError e) { - // Accessibility technologies load JAWT themselves; safe to continue - // as long as JAWT is loaded by any loader - if (e.getMessage().indexOf("already loaded") == -1) { - throw e; - } - } - } - System.loadLibrary("jogl_awt"); + AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + // Make sure that awt.dll is loaded before loading jawt.dll. Otherwise + // a Dialog with "awt.dll not found" might pop up. + // See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4481947. + Toolkit.getDefaultToolkit(); + + // Must pre-load JAWT on all non-Mac platforms to + // ensure references from jogl_awt shared object + // will succeed since JAWT shared object isn't in + // default library path + boolean isOSX = System.getProperty("os.name").equals("Mac OS X"); + String[] preload = { "jawt" }; - return null; - } - }); - loadedAWTImpl = true; - } + loadLibrary("jogl_awt", preload, !isOSX, false); + return null; } - } + }); } // See DRIHack.java in com/sun/opengl/impl/x11/ for description of // why this is needed public static void loadDRIHack() { - if (doLoading && !loadedDRIHack) { - synchronized (NativeLibLoader.class) { - if (!loadedDRIHack) { - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - System.loadLibrary("jogl_drihack"); - return null; - } - }); - loadedDRIHack = true; - } + AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + loadLibrary("jogl_drihack", null, false, false); + return null; } - } + }); + } + + public static void loadCgImpl() { + AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + String[] preload = { "cg", "cgGL" }; + loadLibrary("jogl_cg", preload, true, true); + return null; + } + }); } } |