# [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. ```