import java.lang.foreign.*;
import java.lang.invoke.MethodHandle;
import static java.lang.foreign.ValueLayout.*;

public class FfmStrlenDemo {
    public static void main(String[] args) throws Throwable {
        Linker linker = Linker.nativeLinker();
        SymbolLookup lookup = linker.defaultLookup();
        MethodHandle strlen = linker.downcallHandle(
                lookup.find("strlen").orElseThrow(),
                FunctionDescriptor.of(JAVA_LONG, ADDRESS));

        try (Arena arena = Arena.ofConfined()) {
            MemorySegment text = arena.allocateUtf8String("Hello, JDK 21!");
            long length = (long) strlen.invokeExact(text);
            System.out.println("strlen=" + length);
            System.out.println("size=" + text.byteSize());
        }
    }
}
