< prev index next >
src/java.base/share/classes/jdk/internal/nicl/NativeLibraryImpl.java
Print this page
@@ -25,17 +25,22 @@
import jdk.internal.misc.Unsafe;
import jdk.internal.org.objectweb.asm.Type;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodType;
+import java.io.File;
import java.nicl.Library;
+import java.nicl.NativeLibrary;
import java.nicl.metadata.LibraryDependencies;
-import java.nicl.metadata.LibraryDependency;
import java.nicl.metadata.NativeType;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Map;
import java.util.WeakHashMap;
+import java.util.Optional;
import java.security.AccessController;
import java.security.PrivilegedAction;
public class NativeLibraryImpl {
enum ImplType {
@@ -143,47 +148,63 @@
private static Library loadLibrary(String name, boolean isAbsolute) {
return Platform.getInstance().loadLibrary(name, isAbsolute);
}
public static Library loadLibrary(String name) {
+ assert name.indexOf(File.separatorChar) == -1;
return loadLibrary(name, false);
}
- public static Library loadLibraryFile(String name) {
- return loadLibrary(name, true);
- }
-
- private static Library loadLibrary(LibraryDependency dep) {
- if (dep.isAbsolute()) {
- return loadLibraryFile(dep.name());
+ public static Library load(String path) {
+ assert new File(path).isAbsolute();
+ return loadLibrary(path, true);
+ }
+
+ // return the absolute path of the library of given name by searching
+ // in the given array of paths.
+ private static Optional<Path> findLibraryPath(Path[] paths, String libName) {
+ return Arrays.stream(paths).
+ map(p -> p.resolve(System.mapLibraryName(libName))).
+ filter(Files::isRegularFile).map(Path::toAbsolutePath).findFirst();
+ }
+
+ private static Library[] loadLibraries(LibraryDependencies deps) {
+ String[] pathStrs = deps.paths();
+ if (pathStrs == null || pathStrs.length == 0) {
+ return Arrays.stream(deps.names()).map(
+ NativeLibrary::loadLibrary).toArray(Library[]::new);
} else {
- return loadLibrary(dep.name());
+ Path[] paths = Arrays.stream(pathStrs).map(Paths::get).toArray(Path[]::new);
+ return Arrays.stream(deps.names()).map(libName -> {
+ Optional<Path> absPath = findLibraryPath(paths, libName);
+ return absPath.isPresent() ?
+ NativeLibrary.load(absPath.get().toString()) :
+ NativeLibrary.loadLibrary(libName);
+ }).toArray(Library[]::new);
}
}
- private static LibraryDependency[] getLibraryDependenciesForClass(Class<?> c) {
+ private static LibraryDependencies getLibraryDependenciesForClass(Class<?> c) {
if (c.isAnnotationPresent(LibraryDependencies.class)) {
- return c.getAnnotation(LibraryDependencies.class).value();
- } else if (c.isAnnotationPresent(LibraryDependency.class)) {
- return new LibraryDependency[] { c.getAnnotation(LibraryDependency.class) };
+ return c.getAnnotation(LibraryDependencies.class);
} else {
return null;
}
}
private static SymbolLookup getSymbolLookupForClass(Class<?> c) {
- LibraryDependency[] deps = getLibraryDependenciesForClass(c);
+ LibraryDependencies deps = getLibraryDependenciesForClass(c);
Library[] libs;
if (deps == null) {
- // FIXME: Require @LibraryDependency on all relevant classes
- //System.err.println("WARNING: No @LibraryDependency annotation on class " + c.getName());
- //throw new IllegalArgumentException("No @LibraryDependency annotation on class " + c.getName());
+ // FIXME: Require @LibraryDependencies on all relevant classes
+ // System.err.println("WARNING: No @LibraryDependencies annotation on class " + c.getName());
+ // throw new IllegalArgumentException("No @LibraryDependencies annotation on class " + c.getName());
libs = new Library[] { getDefaultLibrary() };
} else {
- libs = Arrays.stream(deps).map(NativeLibraryImpl::loadLibrary).toArray(Library[]::new);
+ libs = loadLibraries(deps);
}
return new SymbolLookup(libs);
}
< prev index next >