Luigit
repositories / dotfiles

dotfiles

bugabingas dorkfiles

owned by admin

pi/agent/skills/optional/java/java-ffm/examples/jep-454.md

Raw
Rendered preview

JEP 454 examples

Source: https://openjdk.org/jeps/454

Minimal downcall shape:

Linker linker = Linker.nativeLinker();
SymbolLookup stdlib = linker.defaultLookup();
MethodHandle strlen = linker.downcallHandle(
    stdlib.findOrThrow("strlen"),
    FunctionDescriptor.of(JAVA_LONG, ADDRESS)
);

try (Arena arena = Arena.ofConfined()) {
    MemorySegment cString = arena.allocateFrom("hello");
    long len = (long) strlen.invokeExact(cString);
}

JEP-style native sort flow: allocate off-heap strings, pass pointer array to C, copy results back, then close the arena.

Linker linker = Linker.nativeLinker();
SymbolLookup stdlib = linker.defaultLookup();
MethodHandle radixsort = linker.downcallHandle(
    stdlib.findOrThrow("radixsort"),
    FunctionDescriptor.of(JAVA_INT, ADDRESS, JAVA_INT, ADDRESS, JAVA_BYTE)
);

String[] javaStrings = { "mouse", "cat", "dog", "car" };

try (Arena arena = Arena.ofConfined()) {
    MemorySegment pointers = arena.allocate(ADDRESS, javaStrings.length);

    for (int i = 0; i < javaStrings.length; i++) {
        MemorySegment cString = arena.allocateFrom(javaStrings[i]);
        pointers.setAtIndex(ADDRESS, i, cString);
    }

    radixsort.invokeExact(pointers, javaStrings.length, MemorySegment.NULL, (byte) 0);

    for (int i = 0; i < javaStrings.length; i++) {
        MemorySegment cString = pointers.getAtIndex(ADDRESS, i);
        javaStrings[i] = cString.reinterpret(100).getString(0);
    }
}

Native memory lifetime rule:

MemorySegment leaked;
try (Arena arena = Arena.ofConfined()) {
    leaked = arena.allocate(100);
}
// leaked.get(JAVA_BYTE, 0) now fails: arena is closed.
# [JEP 454](https://openjdk.org/jeps/454) examples

Source: https://openjdk.org/jeps/454

Minimal downcall shape:

```java
Linker linker = Linker.nativeLinker();
SymbolLookup stdlib = linker.defaultLookup();
MethodHandle strlen = linker.downcallHandle(
    stdlib.findOrThrow("strlen"),
    FunctionDescriptor.of(JAVA_LONG, ADDRESS)
);

try (Arena arena = Arena.ofConfined()) {
    MemorySegment cString = arena.allocateFrom("hello");
    long len = (long) strlen.invokeExact(cString);
}
```

JEP-style native sort flow: allocate off-heap strings, pass pointer array to C, copy results back, then close the arena.

```java
Linker linker = Linker.nativeLinker();
SymbolLookup stdlib = linker.defaultLookup();
MethodHandle radixsort = linker.downcallHandle(
    stdlib.findOrThrow("radixsort"),
    FunctionDescriptor.of(JAVA_INT, ADDRESS, JAVA_INT, ADDRESS, JAVA_BYTE)
);

String[] javaStrings = { "mouse", "cat", "dog", "car" };

try (Arena arena = Arena.ofConfined()) {
    MemorySegment pointers = arena.allocate(ADDRESS, javaStrings.length);

    for (int i = 0; i < javaStrings.length; i++) {
        MemorySegment cString = arena.allocateFrom(javaStrings[i]);
        pointers.setAtIndex(ADDRESS, i, cString);
    }

    radixsort.invokeExact(pointers, javaStrings.length, MemorySegment.NULL, (byte) 0);

    for (int i = 0; i < javaStrings.length; i++) {
        MemorySegment cString = pointers.getAtIndex(ADDRESS, i);
        javaStrings[i] = cString.reinterpret(100).getString(0);
    }
}
```

Native memory lifetime rule:

```java
MemorySegment leaked;
try (Arena arena = Arena.ofConfined()) {
    leaked = arena.allocate(100);
}
// leaked.get(JAVA_BYTE, 0) now fails: arena is closed.
```