From 5d211c6fa6a0452cc4569712e436184e34504a88 Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Sun, 16 Jun 2013 19:16:31 +0200
Subject: Fix DynamicLinker Impl: Add Bionic specialization using Bionic's non
 POSIX values; Using same pattern for Mac OS X.

Add Bionic specialization using Bionic's non POSIX values
 - derive from UnixDynamicLinkerImpl
 - specify own flag and mode values
 - use UnixDynamicLinkerImpl native code

Using same pattern for Mac OS X
 - derive from UnixDynamicLinkerImpl
 - specify own flag and mode values
 - use UnixDynamicLinkerImpl native code
 - drop MacOSXDynamicLinkerImpl native code
---
 src/java/com/jogamp/common/os/NativeLibrary.java   |  8 +++-
 .../jogamp/common/os/BionicDynamicLinkerImpl.java  | 54 ++++++++++++++++++++++
 .../jogamp/common/os/MacOSXDynamicLinkerImpl.java  | 51 ++++++--------------
 .../jogamp/common/os/UnixDynamicLinkerImpl.java    | 29 ++++++------
 .../jogamp/common/os/WindowsDynamicLinkerImpl.java |  7 +--
 5 files changed, 90 insertions(+), 59 deletions(-)
 create mode 100644 src/java/jogamp/common/os/BionicDynamicLinkerImpl.java

(limited to 'src/java')

diff --git a/src/java/com/jogamp/common/os/NativeLibrary.java b/src/java/com/jogamp/common/os/NativeLibrary.java
index 2351391..bfc5b07 100644
--- a/src/java/com/jogamp/common/os/NativeLibrary.java
+++ b/src/java/com/jogamp/common/os/NativeLibrary.java
@@ -43,6 +43,7 @@ package com.jogamp.common.os;
 import com.jogamp.common.util.IOUtil;
 import com.jogamp.common.util.cache.TempJarCache;
 
+import jogamp.common.os.BionicDynamicLinkerImpl;
 import jogamp.common.os.MacOSXDynamicLinkerImpl;
 import jogamp.common.os.PlatformPropsImpl;
 import jogamp.common.os.UnixDynamicLinkerImpl;
@@ -87,9 +88,14 @@ public class NativeLibrary implements DynamicLookupHelper {
         suffixes = new String[] { ".dylib", ".jnilib" };
         break;
 
+      case ANDROID:
+        dynLink = new BionicDynamicLinkerImpl();
+        prefixes = new String[] { "lib" };
+        suffixes = new String[] { ".so" };
+        break;
+        
       /*
       case FREEBSD:
-      case DALVIK:
       case SUNOS:
       case HPUX: 
       case OPENKODE:         
diff --git a/src/java/jogamp/common/os/BionicDynamicLinkerImpl.java b/src/java/jogamp/common/os/BionicDynamicLinkerImpl.java
new file mode 100644
index 0000000..3864ab2
--- /dev/null
+++ b/src/java/jogamp/common/os/BionicDynamicLinkerImpl.java
@@ -0,0 +1,54 @@
+package jogamp.common.os;
+
+import com.jogamp.common.util.SecurityUtil;
+
+/**
+ * Bionic specialization of {@link UnixDynamicLinkerImpl}
+ * utilizing Bionic's non POSIX flags and mode values.
+ * <p>
+ * Bionic is used on Android.
+ * </p>
+ */
+public class BionicDynamicLinkerImpl extends UnixDynamicLinkerImpl {
+  private static final long RTLD_DEFAULT = 0xffffffffL;
+  //      static final long RTLD_NEXT    = 0xfffffffeL;
+  
+  private static final int RTLD_LAZY     = 0x00001;
+  //      static final int RTLD_NOW      = 0x00000;
+  private static final int RTLD_LOCAL    = 0x00000;
+  private static final int RTLD_GLOBAL   = 0x00002;
+
+  // --- Begin CustomJavaCode .cfg declarations
+  public long openLibraryLocal(String pathname, boolean debug) throws SecurityException {
+    // Note we use RTLD_GLOBAL visibility to _NOT_ allow this functionality to
+    // be used to pre-resolve dependent libraries of JNI code without
+    // requiring that all references to symbols in those libraries be
+    // looked up dynamically via the ProcAddressTable mechanism; in
+    // other words, one can actually link against the library instead of
+    // having to dlsym all entry points. System.loadLibrary() uses
+    // RTLD_LOCAL visibility so can't be used for this purpose.
+    SecurityUtil.checkLinkPermission(pathname);
+    return dlopen(pathname, RTLD_LAZY | RTLD_LOCAL);
+  }
+
+  public long openLibraryGlobal(String pathname, boolean debug) throws SecurityException {
+    // Note we use RTLD_GLOBAL visibility to allow this functionality to
+    // be used to pre-resolve dependent libraries of JNI code without
+    // requiring that all references to symbols in those libraries be
+    // looked up dynamically via the ProcAddressTable mechanism; in
+    // other words, one can actually link against the library instead of
+    // having to dlsym all entry points. System.loadLibrary() uses
+    // RTLD_LOCAL visibility so can't be used for this purpose.
+    SecurityUtil.checkLinkPermission(pathname);
+    return dlopen(pathname, RTLD_LAZY | RTLD_GLOBAL);
+  }
+  
+  public long lookupSymbolGlobal(String symbolName) {
+    final long addr = dlsym(RTLD_DEFAULT, symbolName);
+    if(DEBUG_LOOKUP) {
+        System.err.println("DynamicLinkerImpl.lookupSymbolGlobal("+symbolName+") -> 0x"+Long.toHexString(addr));
+    }
+    return addr;    
+  }
+  
+}
diff --git a/src/java/jogamp/common/os/MacOSXDynamicLinkerImpl.java b/src/java/jogamp/common/os/MacOSXDynamicLinkerImpl.java
index 95f7e63..09ee48d 100644
--- a/src/java/jogamp/common/os/MacOSXDynamicLinkerImpl.java
+++ b/src/java/jogamp/common/os/MacOSXDynamicLinkerImpl.java
@@ -1,32 +1,20 @@
-/* !---- DO NOT EDIT: This file autogenerated by com\sun\gluegen\JavaEmitter.java on Mon Jul 31 16:27:00 PDT 2006 ----! */
-
 package jogamp.common.os;
 
-import com.jogamp.common.os.DynamicLinker;
 import com.jogamp.common.util.SecurityUtil;
 
+/**
+ * Mac OS X specialization of {@link UnixDynamicLinkerImpl}
+ * utilizing OS X 's non POSIX flags and mode values.
+ */
+public class MacOSXDynamicLinkerImpl extends UnixDynamicLinkerImpl {
 
-public class MacOSXDynamicLinkerImpl implements DynamicLinker {
-
-  public static final long RTLD_DEFAULT = -2;
-
-  public static final int RTLD_LAZY = 0x1;
-  public static final int RTLD_NOW = 0x2;
-  public static final int RTLD_LOCAL = 0x4;
-  public static final int RTLD_GLOBAL = 0x8;
-
-  /** Interface to C language function: <br> <code> int dlclose(void *  __handle); </code>    */
-  private static native int dlclose(long __handle);
-
-  /** Interface to C language function: <br> <code> char *  dlerror(void); </code>    */
-  private static native java.lang.String dlerror();
-
-  /** Interface to C language function: <br> <code> void *  dlopen(const char *  __path, int __mode); </code>    */
-  private static native long dlopen(java.lang.String __path, int __mode);
-
-  /** Interface to C language function: <br> <code> void *  dlsym(void *  __handle, const char *  __symbol); </code>    */
-  private static native long dlsym(long __handle, java.lang.String __symbol);
+  private static final long RTLD_DEFAULT = -2L;
+  //      static final long RTLD_NEXT    = -1L;
 
+  private static final int RTLD_LAZY     = 0x00001;
+  //      static final int RTLD_NOW      = 0x00002;
+  private static final int RTLD_LOCAL    = 0x00004;
+  private static final int RTLD_GLOBAL   = 0x00008;
 
   // --- Begin CustomJavaCode .cfg declarations
   public long openLibraryLocal(String pathname, boolean debug) throws SecurityException {
@@ -53,25 +41,12 @@ public class MacOSXDynamicLinkerImpl implements DynamicLinker {
     return dlopen(pathname, RTLD_LAZY | RTLD_GLOBAL);
   }
   
-  public long lookupSymbol(long libraryHandle, String symbolName) {
-    final long addr = dlsym(libraryHandle, symbolName);
-    if(DEBUG_LOOKUP) {
-        System.err.println("MaxOSXDynamicLinkerImpl.lookupSymbol(0x"+Long.toHexString(libraryHandle)+", "+symbolName+") -> 0x"+Long.toHexString(addr));
-    }
-    return addr;    
-  }
-  
   public long lookupSymbolGlobal(String symbolName) {
     final long addr = dlsym(RTLD_DEFAULT, symbolName);
     if(DEBUG_LOOKUP) {
-        System.err.println("MacOSXDynamicLinkerImpl.lookupSymbolGlobal("+symbolName+") -> 0x"+Long.toHexString(addr));
+        System.err.println("DynamicLinkerImpl.lookupSymbolGlobal("+symbolName+") -> 0x"+Long.toHexString(addr));
     }
     return addr;    
   }
   
-  public void closeLibrary(long libraryHandle) {
-    dlclose(libraryHandle);
-  }
-  // ---- End CustomJavaCode .cfg declarations
-
-} // end of class MacOSXDynamicLinkerImpl
+}
diff --git a/src/java/jogamp/common/os/UnixDynamicLinkerImpl.java b/src/java/jogamp/common/os/UnixDynamicLinkerImpl.java
index 2258dfa..e4cdbda 100644
--- a/src/java/jogamp/common/os/UnixDynamicLinkerImpl.java
+++ b/src/java/jogamp/common/os/UnixDynamicLinkerImpl.java
@@ -1,5 +1,3 @@
-/* !---- DO NOT EDIT: This file autogenerated by com\sun\gluegen\JavaEmitter.java on Mon Jul 31 16:26:59 PDT 2006 ----! */
-
 package jogamp.common.os;
 
 import com.jogamp.common.os.DynamicLinker;
@@ -8,23 +6,25 @@ import com.jogamp.common.util.SecurityUtil;
 
 public class UnixDynamicLinkerImpl implements DynamicLinker {
 
-  public static final long RTLD_DEFAULT = 0;
-  public static final int RTLD_LAZY     = 0x00001;
-  public static final int RTLD_NOW      = 0x00002;
-  public static final int RTLD_GLOBAL   = 0x00100;
-  public static final int RTLD_LOCAL    = 0x00000;
+  private static final long RTLD_DEFAULT = 0;
+  //      static final long RTLD_NEXT    = -1L;
+  
+  private static final int RTLD_LAZY     = 0x00001;
+  //      static final int RTLD_NOW      = 0x00002;
+  private static final int RTLD_LOCAL    = 0x00000;
+  private static final int RTLD_GLOBAL   = 0x00100;
 
   /** Interface to C language function: <br> <code> int dlclose(void * ); </code>    */
-  private static native int dlclose(long arg0);
+  /* pp */ static native int dlclose(long arg0);
 
   /** Interface to C language function: <br> <code> char *  dlerror(void); </code>    */
-  private static native java.lang.String dlerror();
+  /* pp */ static native java.lang.String dlerror();
 
   /** Interface to C language function: <br> <code> void *  dlopen(const char * , int); </code>    */
-  private static native long dlopen(java.lang.String arg0, int arg1);
+  /* pp */ static native long dlopen(java.lang.String arg0, int arg1);
 
   /** Interface to C language function: <br> <code> void *  dlsym(void * , const char * ); </code>    */
-  private static native long dlsym(long arg0, java.lang.String arg1);
+  /* pp */ static native long dlsym(long arg0, java.lang.String arg1);
 
 
   // --- Begin CustomJavaCode .cfg declarations
@@ -55,7 +55,7 @@ public class UnixDynamicLinkerImpl implements DynamicLinker {
   public long lookupSymbol(long libraryHandle, String symbolName) {
     final long addr = dlsym(libraryHandle, symbolName);
     if(DEBUG_LOOKUP) {
-        System.err.println("UnixDynamicLinkerImpl.lookupSymbol(0x"+Long.toHexString(libraryHandle)+", "+symbolName+") -> 0x"+Long.toHexString(addr));
+        System.err.println("DynamicLinkerImpl.lookupSymbol(0x"+Long.toHexString(libraryHandle)+", "+symbolName+") -> 0x"+Long.toHexString(addr));
     }
     return addr;    
   }
@@ -63,7 +63,7 @@ public class UnixDynamicLinkerImpl implements DynamicLinker {
   public long lookupSymbolGlobal(String symbolName) {
     final long addr = dlsym(RTLD_DEFAULT, symbolName);
     if(DEBUG_LOOKUP) {
-        System.err.println("UnixDynamicLinkerImpl.lookupSymbolGlobal("+symbolName+") -> 0x"+Long.toHexString(addr));
+        System.err.println("DynamicLinkerImpl.lookupSymbolGlobal("+symbolName+") -> 0x"+Long.toHexString(addr));
     }
     return addr;    
   }
@@ -71,6 +71,5 @@ public class UnixDynamicLinkerImpl implements DynamicLinker {
   public void closeLibrary(long libraryHandle) {
     dlclose(libraryHandle);
   }
-  // ---- End CustomJavaCode .cfg declarations
 
-} // end of class UnixDynamicLinkerImpl
+}
diff --git a/src/java/jogamp/common/os/WindowsDynamicLinkerImpl.java b/src/java/jogamp/common/os/WindowsDynamicLinkerImpl.java
index eb02584..17d4adc 100644
--- a/src/java/jogamp/common/os/WindowsDynamicLinkerImpl.java
+++ b/src/java/jogamp/common/os/WindowsDynamicLinkerImpl.java
@@ -1,5 +1,3 @@
-/* !---- DO NOT EDIT: This file autogenerated by com\sun\gluegen\JavaEmitter.java on Tue May 27 02:37:55 PDT 2008 ----! */
-
 package jogamp.common.os;
 
 import com.jogamp.common.os.DynamicLinker;
@@ -51,7 +49,7 @@ public class WindowsDynamicLinkerImpl implements DynamicLinker {
         }
     }
     if(DEBUG_LOOKUP) {
-        System.err.println("WindowsDynamicLinkerImpl.lookupSymbol(0x"+Long.toHexString(libraryHandle)+", "+symbolName+") -> "+_symbolName+", 0x"+Long.toHexString(addr));
+        System.err.println("DynamicLinkerImpl.lookupSymbol(0x"+Long.toHexString(libraryHandle)+", "+symbolName+") -> "+_symbolName+", 0x"+Long.toHexString(addr));
     }
     return addr;
   }
@@ -67,6 +65,5 @@ public class WindowsDynamicLinkerImpl implements DynamicLinker {
   public void closeLibrary(long libraryHandle) {
     FreeLibrary(libraryHandle);
   }
-  // ---- End CustomJavaCode .cfg declarations
 
-} // end of class WindowsDynamicLinkerImpl
+}
-- 
cgit v1.2.3