System.loadLibrary and CLinker.lookup exception

Jack Andrews effbiae at gmail.com
Tue Apr 26 10:39:33 UTC 2022


hi - i'm getting used to FFI in JDK 18. any help with the following problem
is much appreciated.

I have a C function `kinit` in libk.so:
$ nm -D ./libk.so |grep kinit
00000000000296f0 T kinit

$ java --version
openjdk 18.0.1 2022-04-19
OpenJDK Runtime Environment (build 18.0.1+10-24)
OpenJDK 64-Bit Server VM (build 18.0.1+10-24, mixed mode, sharing)

$ cat Example.java
import jdk.incubator.foreign.*;
import java.lang.invoke.*;
import static jdk.incubator.foreign.ValueLayout.*;

public class Example {

    static CLinker LINKER = CLinker.systemCLinker();

    public static void main(String[] args) throws Throwable {
        System.loadLibrary("k");
        kinit();
    }

    public static void kinit() throws Throwable {
        MethodHandle kinit = LINKER.downcallHandle(
  /* LINE 16 */ LINKER.lookup("kinit").get(),
                FunctionDescriptor.of(JAVA_INT)
        );

        {
            int r = (int) kinit.invoke();
            System.out.println(r);
        }
    }
}

my code appears to load libk.so, but fails to find kinit:

$ LD_LIBRARY_PATH=. java --add-modules jdk.incubator.foreign
--enable-native-access=ALL-UNNAMED Example.java
WARNING: Using incubator modules: jdk.incubator.foreign
warning: using incubating module(s): jdk.incubator.foreign
1 warning
Exception in thread "main" java.util.NoSuchElementException: No value
present
at java.base/java.util.Optional.get(Optional.java:143)
at Example.kinit(Example.java:16)
at Example.main(Example.java:11)

best,
jack


More information about the panama-dev mailing list