29package org.jau.sys.dl;
31import java.util.Iterator;
34import org.jau.lang.ExceptionUtils;
35import org.jau.sys.JNILibrary;
36import org.jau.sys.PlatformProps;
37import org.jau.sys.RuntimeProps;
39import jau.sys.dl.BionicDynamicLinker32bitImpl;
40import jau.sys.dl.BionicDynamicLinker64BitImpl;
41import jau.sys.dl.MacOSXDynamicLinkerImpl;
42import jau.sys.dl.PosixDynamicLinkerImpl;
43import jau.sys.dl.WindowsDynamicLinkerImpl;
64 private long libraryHandle;
67 private final String libraryPath;
69 private final boolean global;
72 private NativeLibrary(
final DynamicLinker dynLink,
final long libraryHandle,
final String libraryPath,
final boolean global) {
73 this.dynLink = dynLink;
74 this.libraryHandle = libraryHandle;
75 this.libraryPath = libraryPath;
78 System.err.println(
"NativeLibrary.open(): Successfully loaded: " +
this);
84 return "NativeLibrary[" + dynLink.getClass().getSimpleName() +
", " + libraryPath +
", 0x" + Long.toHexString(libraryHandle) +
", global " + global +
"]";
108 public static final NativeLibrary
open(
final String libName,
109 final boolean searchSystemPath,
110 final boolean searchSystemPathFirst,
111 final ClassLoader loader,
final boolean global)
throws SecurityException {
112 return open(libName, libName, libName, searchSystemPath, searchSystemPathFirst, loader, global);
147 public static final NativeLibrary
open(
final String libName,
148 final String unixLibName,
149 final String macOSXLibName,
150 final boolean searchSystemPath,
151 final boolean searchSystemPathFirst,
152 final ClassLoader loader,
final boolean global)
throws SecurityException {
156 searchSystemPath, searchSystemPathFirst,
163 for (
final Iterator<String> iter = possiblePaths.iterator(); iter.hasNext(); ) {
164 final String path = iter.next();
166 System.err.println(
"NativeLibrary.open(global "+global+
"): Trying to load " + path);
172 res = dynLink.openLibraryGlobal(path,
DEBUG);
174 res = dynLink.openLibraryLocal(path,
DEBUG);
176 }
catch (
final Throwable t1) {
181 return new NativeLibrary(dynLink, res, path, global);
184 System.err.println(
"NativeLibrary.open: Caught "+t.getClass().getSimpleName()+
": "+t.getMessage());
188 errstr = dynLink.getLastError();
189 }
catch (
final Throwable t2) { errstr=
null; }
190 System.err.println(
"NativeLibrary.open: Last error "+errstr);
198 System.err.println(
"NativeLibrary.open(global "+global+
"): Did not succeed in loading (" + libName +
", " + unixLibName +
", " + macOSXLibName +
")");
209 dynLink.claimAllLinkPermission();
213 dynLink.releaseAllLinkPermission();
218 if ( 0 == libraryHandle ) {
219 throw new RuntimeException(
"Library is not open");
221 return dynLink.lookupSymbol(libraryHandle, funcName);
226 if ( 0 == libraryHandle ) {
227 throw new RuntimeException(
"Library is not open");
229 return 0 != dynLink.lookupSymbol(libraryHandle, funcName);
236 return dynLink.lookupSymbolGlobal(funcName);
241 static DynamicLinker getDynamicLinker() {
242 final DynamicLinker dynLink;
245 dynLink =
new WindowsDynamicLinkerImpl();
250 dynLink =
new MacOSXDynamicLinkerImpl();
255 dynLink =
new BionicDynamicLinker32bitImpl();
257 dynLink =
new BionicDynamicLinker64BitImpl();
262 dynLink =
new PosixDynamicLinkerImpl();
272 return libraryHandle;
284 public final void close() throws SecurityException {
286 System.err.println(
"NativeLibrary.close(): closing " +
this);
288 if ( 0 == libraryHandle ) {
289 throw new RuntimeException(
"Library already closed");
291 final long handle = libraryHandle;
293 dynLink.closeLibrary(handle,
DEBUG);
295 System.err.println(
"NativeLibrary.close(): Successfully closed " +
this);
static void dumpStack(final PrintStream out)
Static JNI Native Libraries handler.
static final List< String > enumerateLibraryPaths(final String libName, final boolean searchSystemPath, final boolean searchSystemPathFirst, final ClassLoader loader)
Given the base library names (no prefixes/suffixes) for the various platforms, enumerate the possible...
Runtime platform properties derived from PlatformProps and runtime query.
static void initSingleton()
static final NativeLibrary open(final String libName, final boolean searchSystemPath, final boolean searchSystemPathFirst, final ClassLoader loader, final boolean global)
Opens the given native library, assuming it has the same base name on all platforms.
final String getLibraryPath()
Retrieves the path under which this library was opened.
static final NativeLibrary open(final String libName, final String unixLibName, final String macOSXLibName, final boolean searchSystemPath, final boolean searchSystemPathFirst, final ClassLoader loader, final boolean global)
Opens the given native library, assuming it has the given base names (no "lib" prefix or "....
final long dynamicLookupFunction(final String funcName)
Returns the function handle for function 'funcName'.
final long dynamicLookupFunctionGlobal(final String funcName)
Looks up the given function name in all loaded libraries.
final void claimAllLinkPermission()
final boolean isFunctionAvailable(final String funcName)
Queries whether function 'funcName' is available.
final long getLibraryHandle()
Retrieves the low-level library handle from this NativeLibrary object.
final void releaseAllLinkPermission()
final void close()
Closes this native library.
Low level secure dynamic linker access.
static final boolean DEBUG