< prev index next >

src/jdk.jextract/share/classes/com/sun/tools/jextract/Context.java

Print this page

        

@@ -21,28 +21,31 @@
  * questions.
  */
 package com.sun.tools.jextract;
 
 import jdk.internal.clang.*;
-import jdk.internal.foreign.LibrariesHelper;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.io.UncheckedIOException;
 import java.lang.invoke.MethodHandles;
+import java.lang.invoke.MethodHandles.Lookup;
 import java.foreign.Library;
+import java.foreign.Libraries;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Properties;
 import java.util.Set;
 import java.util.TreeSet;
 import java.util.function.Function;
 import java.util.function.Predicate;

@@ -139,13 +142,44 @@
 
     void addExcludeSymbols(String pattern) {
         excludeSymbols.add(Pattern.compile(pattern));
     }
 
+    // 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();
+    }
+
+    /*
+     * Load the specified shared libraries from the specified paths.
+     *
+     * @param lookup Lookup object of the caller.
+     * @param pathStrs array of paths to load the shared libraries from.
+     * @param names array of shared library names.
+     */
+    // used by jextract tool to load libraries for symbol checks.
+    public static Library[] loadLibraries(Lookup lookup, String[] pathStrs, String[] names) {
+        if (pathStrs == null || pathStrs.length == 0) {
+            return Arrays.stream(names).map(
+                name -> Libraries.loadLibrary(lookup, name)).toArray(Library[]::new);
+        } else {
+            Path[] paths = Arrays.stream(pathStrs).map(Paths::get).toArray(Path[]::new);
+            return Arrays.stream(names).map(libName -> {
+                Optional<Path> absPath = findLibraryPath(paths, libName);
+                return absPath.isPresent() ?
+                    Libraries.load(lookup, absPath.get().toString()) :
+                    Libraries.loadLibrary(lookup, libName);
+            }).toArray(Library[]::new);
+        }
+    }
+
     private void initSymChecker() {
         if (!libraryNames.isEmpty() && !linkCheckPaths.isEmpty()) {
-            Library[] libs = LibrariesHelper.loadLibraries(MethodHandles.lookup(),
+            Library[] libs = loadLibraries(MethodHandles.lookup(),
                 linkCheckPaths.toArray(new String[0]),
                 libraryNames.toArray(new String[0]));
 
             // check if the given symbol is found in any of the libraries or not.
             // If not found, warn the user for the missing symbol.
< prev index next >