From 644eb1c3157ba3a18e4aec0f7bcb55081a9a3320 Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Thu, 1 Dec 2011 16:19:59 +0100
Subject: DynamicLibraryBundle/NativeLibrary: Add destroy() to bundle, causing
 unloading of native library.

---
 .../com/jogamp/common/os/DynamicLibraryBundle.java | 23 +++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

(limited to 'src/java/com/jogamp/common/os/DynamicLibraryBundle.java')

diff --git a/src/java/com/jogamp/common/os/DynamicLibraryBundle.java b/src/java/com/jogamp/common/os/DynamicLibraryBundle.java
index b7e0739..c8bf30a 100755
--- a/src/java/com/jogamp/common/os/DynamicLibraryBundle.java
+++ b/src/java/com/jogamp/common/os/DynamicLibraryBundle.java
@@ -71,6 +71,7 @@ public class DynamicLibraryBundle implements DynamicLookupHelper {
     private HashSet<String> toolGetProcAddressFuncNameSet;
     private List<String> toolGetProcAddressFuncNameList;
 
+    /** Instantiates and loads all {@link NativeLibrary}s incl. JNI libraries. */
     public DynamicLibraryBundle(DynamicLibraryBundleInfo info) {
         if(null==info) {
             throw new RuntimeException("Null DynamicLibraryBundleInfo");
@@ -102,6 +103,26 @@ public class DynamicLibraryBundle implements DynamicLookupHelper {
             System.err.println("     All Complete: "+isLibComplete());
         }
     }
+    
+    /** Unload all {@link NativeLibrary}s, and remove all references. */
+    public void destroy() {
+        if(DEBUG) {
+            System.err.println(Thread.currentThread().getName()+" - DynamicLibraryBundle.destroy() START: "+info.getClass().getName());
+        }
+        toolGetProcAddressFuncNameSet = null;
+        toolGetProcAddressHandle = 0;
+        for(int i = 0; i<nativeLibraries.size(); i++) {
+            nativeLibraries.get(i).close();
+        }
+        nativeLibraries.clear();
+        nativeLibraries = null;
+        toolLibNames = null;
+        glueLibNames = null;
+        if(DEBUG) {
+            System.err.println(Thread.currentThread().getName()+" - DynamicLibraryBundle.destroy() END: "+info.getClass().getName());
+        }
+        info = null;
+    }
 
     public final boolean isLibComplete() {
         return isToolLibComplete() && isGlueLibComplete() ;
@@ -267,7 +288,7 @@ public class DynamicLibraryBundle implements DynamicLookupHelper {
             }
         }
     }
-
+    
     private long dynamicLookupFunctionOnLibs(String funcName) {
         if(!isToolLibLoaded() || null==funcName) {
             if(DEBUG_LOOKUP && !isToolLibLoaded()) {
-- 
cgit v1.2.3