On Mon, 18 Mar 2024 17:43:45 GMT, Suchismith Roy <s...@openjdk.org> wrote:
>> Allow support for both .a and .so files in AIX. >> If .so file is not found, allow fallback to .a extension. >> JBS Issue: [JDK-8319516](https://bugs.openjdk.org/browse/JDK-8319516) > > Suchismith Roy has updated the pull request incrementally with one additional > commit since the last revision: > > trraling spaces Ah, right. Thanks! I should use that `SymbolLookup`: diff --git a/src/main/java/org/openjdk/jextract/clang/libclang/Index_h.java b/src/main/java/org/openjdk/jextract/clang/libclang/Index_h.java index 14eba30..4f92f43 100644 --- a/src/main/java/org/openjdk/jextract/clang/libclang/Index_h.java +++ b/src/main/java/org/openjdk/jextract/clang/libclang/Index_h.java @@ -27,11 +27,13 @@ package org.openjdk.jextract.clang.libclang; +import java.io.File; import java.lang.invoke.*; import java.lang.foreign.*; import java.nio.ByteOrder; import java.util.*; import java.util.function.*; +import java.util.StringTokenizer; import java.util.stream.*; import static java.lang.foreign.ValueLayout.*; @@ -100,14 +102,27 @@ public class Index_h { throw new IllegalArgumentException("Invalid type for ABI: " + c.getTypeName()); } + static SymbolLookup SYMBOL_LOOKUP; + static { - String libName = System.getProperty("os.name").startsWith("Windows") ? "libclang" : "clang"; - System.loadLibrary(libName); + String osName = System.getProperty("os.name"); + String libName = ""; + if (osName.startsWith("AIX")) { + String libPath = System.getProperty("java.library.path"); + StringTokenizer parser = new StringTokenizer(libPath, ":"); + while (parser.hasMoreTokens()) { + libName = parser.nextToken() + "/libclang.a"; + File f = new File(libName); + if (f.exists() && !f.isDirectory()) break; + } + SYMBOL_LOOKUP = SymbolLookup.libraryLookup(libName + "(libclang.so.16)", Arena.global()); + } else { + libName = osName.startsWith("Windows") ? "libclang" : "clang"; + System.loadLibrary(libName); + SYMBOL_LOOKUP = SymbolLookup.loaderLookup().or(Linker.nativeLinker().defaultLookup()); + } } - static final SymbolLookup SYMBOL_LOOKUP = SymbolLookup.loaderLookup() - .or(Linker.nativeLinker().defaultLookup()); - public static final ValueLayout.OfBoolean C_BOOL = ValueLayout.JAVA_BOOLEAN; public static final ValueLayout.OfByte C_CHAR = ValueLayout.JAVA_BYTE; public static final ValueLayout.OfShort C_SHORT = ValueLayout.JAVA_SHORT; The symbols get found and the JVM can really call into the `libclang.a(libclang.so.16)`. Impressive! (That doesn't mean that jextract is working. clang crashes the way we are calling it. Maybe because of a thread stack size or other memory management problem.) So, there is basically a valid solution for loading such libraries. Only not very smooth for Java programmers. ------------- PR Comment: https://git.openjdk.org/jdk/pull/17945#issuecomment-2015811096