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

public class MuatLibrary {
    public static void main(String[] args) throws Throwable {
        // Muat libc secara eksplisit; pemuatan terikat masa hidup arena.
        try (Arena arena = Arena.ofConfined()) {
            SymbolLookup libc = SymbolLookup.libraryLookup("libc.so.6", arena);

            System.out.println("strlen ada  : " + libc.find("strlen").isPresent());
            System.out.println("abs ada     : " + libc.find("abs").isPresent());
            System.out.println("xyz ada     : " + libc.find("simbol_tidak_ada").isPresent());

            // Ambil handle abs lalu panggil lewat downcall biasa.
            MethodHandle abs = Linker.nativeLinker().downcallHandle(
                    libc.find("abs").get(),
                    FunctionDescriptor.of(ValueLayout.JAVA_INT, ValueLayout.JAVA_INT));
            System.out.println("abs(-42)    : " + (int) abs.invoke(-42));
            System.out.println("abs(99)     : " + (int) abs.invoke(99));
        }

        // Nama pustaka yang salah gagal saat dimuat, bukan saat dipanggil.
        try (Arena arena = Arena.ofConfined()) {
            SymbolLookup salah = SymbolLookup.libraryLookup("libtidakada.so", arena);
            System.out.println("baris ini tidak tercapai");
        } catch (IllegalArgumentException e) {
            System.out.println("galat muat  : " + e.getMessage());
        }
    }
}
