< prev index next >
src/java.base/share/classes/jdk/internal/nicl/NativeLibraryImpl.java
Print this page
*** 25,41 ****
import jdk.internal.misc.Unsafe;
import jdk.internal.org.objectweb.asm.Type;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodType;
import java.nicl.Library;
import java.nicl.metadata.LibraryDependencies;
- import java.nicl.metadata.LibraryDependency;
import java.nicl.metadata.NativeType;
import java.util.Arrays;
import java.util.Map;
import java.util.WeakHashMap;
import java.security.AccessController;
import java.security.PrivilegedAction;
public class NativeLibraryImpl {
enum ImplType {
--- 25,46 ----
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.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,189 ****
private static Library loadLibrary(String name, boolean isAbsolute) {
return Platform.getInstance().loadLibrary(name, isAbsolute);
}
public static Library loadLibrary(String name) {
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());
} else {
! return loadLibrary(dep.name());
}
}
! private static LibraryDependency[] 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) };
} else {
return null;
}
}
private static SymbolLookup getSymbolLookupForClass(Class<?> c) {
! LibraryDependency[] 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());
libs = new Library[] { getDefaultLibrary() };
} else {
! libs = Arrays.stream(deps).map(NativeLibraryImpl::loadLibrary).toArray(Library[]::new);
}
return new SymbolLookup(libs);
}
--- 148,210 ----
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 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 {
! 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 LibraryDependencies getLibraryDependenciesForClass(Class<?> c) {
if (c.isAnnotationPresent(LibraryDependencies.class)) {
! return c.getAnnotation(LibraryDependencies.class);
} else {
return null;
}
}
private static SymbolLookup getSymbolLookupForClass(Class<?> c) {
! LibraryDependencies deps = getLibraryDependenciesForClass(c);
Library[] libs;
if (deps == null) {
! // 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 = loadLibraries(deps);
}
return new SymbolLookup(libs);
}
< prev index next >