diff options
Diffstat (limited to 'src/java/jogamp')
-rw-r--r-- | src/java/jogamp/common/os/DynamicLinkerImpl.java | 13 | ||||
-rw-r--r-- | src/java/jogamp/common/os/UnixDynamicLinkerImpl.java | 14 | ||||
-rw-r--r-- | src/java/jogamp/common/os/WindowsDynamicLinkerImpl.java | 9 |
3 files changed, 36 insertions, 0 deletions
diff --git a/src/java/jogamp/common/os/DynamicLinkerImpl.java b/src/java/jogamp/common/os/DynamicLinkerImpl.java index 5ce94c1..13b08d7 100644 --- a/src/java/jogamp/common/os/DynamicLinkerImpl.java +++ b/src/java/jogamp/common/os/DynamicLinkerImpl.java @@ -45,6 +45,7 @@ import com.jogamp.common.util.SecurityUtil; /** * @throws SecurityException if user is not granted global access */ + @Override public final void claimAllLinkPermission() throws SecurityException { synchronized( secSync ) { allLinkPermissionGranted = true; @@ -54,6 +55,7 @@ import com.jogamp.common.util.SecurityUtil; /** * @throws SecurityException if user is not granted global access */ + @Override public final void releaseAllLinkPermission() throws SecurityException { synchronized( secSync ) { allLinkPermissionGranted = false; @@ -120,6 +122,17 @@ import com.jogamp.common.util.SecurityUtil; protected abstract long openLibraryLocalImpl(final String pathname) throws SecurityException; @Override + public final String lookupLibraryPathname(final long libraryHandle, final String symbolName) throws SecurityException { + checkLinkPermission(libraryHandle); + final String fname = lookupLibraryPathnameImpl(libraryHandle, symbolName); + if(DEBUG_LOOKUP) { + System.err.println("DynamicLinkerImpl.lookupLibraryPathname(0x"+Long.toHexString(libraryHandle)+", "+symbolName+") -> '"+fname+"'"); + } + return fname; + } + protected abstract String lookupLibraryPathnameImpl(final long libraryHandle, String symbolName) throws SecurityException; + + @Override public final long lookupSymbolGlobal(final String symbolName) throws SecurityException { checkAllLinkPermission(); final long addr = lookupSymbolGlobalImpl(symbolName); diff --git a/src/java/jogamp/common/os/UnixDynamicLinkerImpl.java b/src/java/jogamp/common/os/UnixDynamicLinkerImpl.java index ddaeea2..4a0aeb4 100644 --- a/src/java/jogamp/common/os/UnixDynamicLinkerImpl.java +++ b/src/java/jogamp/common/os/UnixDynamicLinkerImpl.java @@ -47,6 +47,20 @@ package jogamp.common.os; /** Interface to C language function: <br> <code> void * dlsym(void * , const char * ); </code> */ protected static native long dlsym(long arg0, java.lang.String arg1); + /** Interface to C language function: <br> <code> int dladdr(void * , Dl_info *); </code>, returning the <code>Dl_info.dli_fname</code> */ + protected static native java.lang.String dladdr_fname(long arg0); + + @Override + protected final String lookupLibraryPathnameImpl(final long libraryHandle, final String symbolName) throws SecurityException { + if( 0 != libraryHandle && null != symbolName && symbolName.length() > 0 ) { + final long addr = dlsym(libraryHandle, symbolName); + if( 0 != addr ) { + return dladdr_fname(addr); + } + } + return null; + } + @Override protected final long lookupSymbolLocalImpl(final long libraryHandle, final String symbolName) throws SecurityException { return 0 != libraryHandle ? dlsym(libraryHandle, symbolName) : 0; diff --git a/src/java/jogamp/common/os/WindowsDynamicLinkerImpl.java b/src/java/jogamp/common/os/WindowsDynamicLinkerImpl.java index 04f13fb..a99cb35 100644 --- a/src/java/jogamp/common/os/WindowsDynamicLinkerImpl.java +++ b/src/java/jogamp/common/os/WindowsDynamicLinkerImpl.java @@ -41,6 +41,9 @@ public final class WindowsDynamicLinkerImpl extends DynamicLinkerImpl { /** Interface to C language function: <br> <code> HANDLE LoadLibraryW(LPCWSTR lpLibFileName); </code> */ private static native long LoadLibraryW(java.lang.String lpLibFileName); + /** Interface to C language function: <br> <code> PROC GetModuleFileNameA(HANDLE hModule, LPSTR lpFilename, DWORD nSize); </code> */ + private static native java.lang.String GetModuleFileNameA(long hModule); + @Override protected final long openLibraryLocalImpl(final String libraryName) throws SecurityException { // How does that work under Windows ? @@ -54,6 +57,12 @@ public final class WindowsDynamicLinkerImpl extends DynamicLinkerImpl { } @Override + protected final String lookupLibraryPathnameImpl(final long libraryHandle, final String symbolName) throws SecurityException { + // symbolName is not required + return 0 != libraryHandle ? GetModuleFileNameA(libraryHandle) : null; + } + + @Override protected final long lookupSymbolGlobalImpl(final String symbolName) throws SecurityException { if(DEBUG_LOOKUP) { System.err.println("lookupSymbolGlobal: Not supported on Windows"); |