dotfiles
bugabingas dorkfiles
owned by admin
pi/agent/skills/optional/java/java-ffm/examples/jep-454.md
RawRendered preview
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.
```