import java.lang.foreign.Arena;
import java.lang.foreign.FunctionDescriptor;
import java.lang.foreign.Linker;
import java.lang.foreign.MemorySegment;
import java.lang.foreign.ValueLayout;
import java.lang.invoke.MethodHandle;

public class PanggilNative {

    public static void main(String[] args) throws Throwable {
        // Linker menghubungkan Java dengan pustaka native sistem operasi.
        Linker linker = Linker.nativeLinker();

        // strlen dari libc: panjang string C (tanpa sentinel nol).
        MethodHandle strlen = linker.downcallHandle(
                linker.defaultLookup().find("strlen").get(),
                FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS));

        try (Arena arena = Arena.ofConfined()) {
            // Salin teks Java ke memori native dengan penghenti nol.
            MemorySegment teks = arena.allocateFrom("Halo dari FFM");

            long panjang = (long) strlen.invoke(teks);
            System.out.println("teks    : " + teks.getString(0));
            System.out.println("panjang: " + panjang + " karakter");
        }
    }
}
