diff options
author | Sven Gothel <[email protected]> | 2010-04-08 02:22:12 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2010-04-08 02:22:12 +0200 |
commit | 7cc4bb2a8bcc4c16b6a12826abbd874bf38f9dc1 (patch) | |
tree | eb932553d0f9b36dbe6d703356502bf352cc6eca /src/java/com/jogamp/common/os/WindowsDynamicLinkerImpl.java | |
parent | 82ac66ba1e7494b0a76a2063f0d56d3b785c6c31 (diff) |
http://jogamp.org/bugzilla/show_bug.cgi?id=393
Fixed junit test: test1
- Create seperate native libraries to reflect a real world example:
test1 - the library to bind to (no more declaring __stdcall @nn functions)
BindingTest1p1 - the dynamic fixed linkage binding test1p1,
references dynamic library test1 at linktime.
BindingTest1p2 - the dynamic runtime linkage binding test1p2,
loads dynamic library test1 at runtime.
Generic:
- gluegen-cpptasks-base.xml
- target 'gluegen.cpptasks.detect.os'
Set new property 'system.env.library.path'
DYLD_LIBRARY_PATH (macosx)
LD_LIBRARY_PATH (unix)
PATH (windows)
- target 'gluegen.cpptasks.striplibs'
Strips the symbols out of the native libraries
in case c.compiler.debug is false.
Maybe configured with the properties:
c.strip.tool, c.strip.args
- Using system.env.library.path in junit call
to find the test1 library in case of runtime linkage and lookup (test1p2).
- Use gluegen.cpptasks.striplibs for all native libs ..
- Added macosx32 in analogy to macosx64, both defaults to true now
- com.jogamp.common.os.WindowsDynamicLinkerImpl:lookupSymbol()
- Added lookup for __stdcall @nn (stepping alignment 4, max-args: 12)
in case no undecorated __cdecl symbol is found.
Fixed Windows platform:
- Use proper path.seperator on Windows.
- test1.dll needs proper soname inside for fixed linkage (test1p1)
hence the output name must be test1.dll, not libtest1.so
+++
http://jogamp.org/bugzilla/show_bug.cgi?id=394
Fix MacOsX platform:
The commit of cpptasks.jar, git hash 129e783741d91e9ee5cd7da5d5c962c32ec96b0b,
broke the universal binary build on MacOSX.
The above change used cpptasks-1.05b with a few patches in regards to crosscompilation,
but missed one, which accepts the '-arch' argument for GccLinker undecorated.
The new cpptasks.jar is vanilla 1.05b + cpptasks-1.0b5-darwin-patch.diff,
the latter a more refined one.
This version accepts the '-arch' argument undecorated on the darwin platform.
+++
Diffstat (limited to 'src/java/com/jogamp/common/os/WindowsDynamicLinkerImpl.java')
-rwxr-xr-x | src/java/com/jogamp/common/os/WindowsDynamicLinkerImpl.java | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/src/java/com/jogamp/common/os/WindowsDynamicLinkerImpl.java b/src/java/com/jogamp/common/os/WindowsDynamicLinkerImpl.java index f5a3312..2858f74 100755 --- a/src/java/com/jogamp/common/os/WindowsDynamicLinkerImpl.java +++ b/src/java/com/jogamp/common/os/WindowsDynamicLinkerImpl.java @@ -2,9 +2,20 @@ package com.jogamp.common.os; +import java.security.*; public class WindowsDynamicLinkerImpl implements DynamicLinker { + private static boolean DEBUG; + + static { + AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + DEBUG = (System.getProperty("gluegen.debug.NativeLibrary") != null); + return null; + } + }); + } /** Interface to C language function: <br> <code> BOOL FreeLibrary(HANDLE hLibModule); </code> */ private static native int FreeLibrary(long hLibModule); @@ -36,7 +47,22 @@ public class WindowsDynamicLinkerImpl implements DynamicLinker { } public long lookupSymbol(long libraryHandle, String symbolName) { - return GetProcAddressA(libraryHandle, symbolName); + String _symbolName = symbolName; + long addr = GetProcAddressA(libraryHandle, _symbolName); + if(0==addr) { + // __stdcall hack: try some @nn decorations, + // the leading '_' must not be added (same with cdecl) + final int argAlignment=4; // 4 byte alignment of each argument + final int maxArguments=12; // experience .. + for(int arg=0; 0==addr && arg<=maxArguments; arg++) { + _symbolName = symbolName+"@"+(arg*argAlignment); + addr = GetProcAddressA(libraryHandle, _symbolName); + } + } + if(DEBUG) { + System.err.println("WindowsDynamicLinkerImpl.lookupSymbol(0x"+Long.toHexString(libraryHandle)+", "+symbolName+") -> "+_symbolName+", 0x"+Long.toHexString(addr)); + } + return addr; } public void closeLibrary(long libraryHandle) { |