PHpullh
학습 라이브러리/Java/Project Panama & Foreign Function API (Java 22)

JAVA · 성능/JVM

Project Panama & Foreign Function API (Java 22)

Java 22의 Foreign Function & Memory API로 네이티브 라이브러리를 안전하게 호출합니다.

성능/JVM고급PanamaFFM APIJava 22ArenaMemorySegment

핵심 설명

Java 22의 Foreign Function & Memory API로 네이티브 라이브러리를 안전하게 호출합니다.

Java code

// Java 22 — Foreign Function & Memory API (FFM)
import java.lang.foreign.*;
import java.lang.invoke.*;

public class PanamaDemo {
    public static void main(String[] args) throws Throwable {
        // 시스템 라이브러리 링킹
        Linker linker = Linker.nativeLinker();
        SymbolLookup stdlib = linker.defaultLookup();

        // strlen 함수 가져오기
        MethodHandle strlen = linker.downcallHandle(
            stdlib.find("strlen").orElseThrow(),
            FunctionDescriptor.of(
                ValueLayout.JAVA_LONG,   // 반환 타입: long
                ValueLayout.ADDRESS      // 인자 타입: pointer
            )
        );

        // Native 메모리 할당 (Arena로 수명 관리)
        try (Arena arena = Arena.ofConfined()) {
            MemorySegment str =
                arena.allocateFrom("Hello, Panama!");

            long len = (long) strlen.invoke(str);
            System.out.println("strlen = " + len); // 14
        } // Arena 닫히면 자동 메모리 해제

        // StructLayout — C 구조체 매핑
        MemoryLayout pointLayout = MemoryLayout.structLayout(
            ValueLayout.JAVA_INT.withName("x"),
            ValueLayout.JAVA_INT.withName("y")
        );

        VarHandle xHandle = pointLayout.varHandle(
            MemoryLayout.PathElement.groupElement("x"));

        try (Arena arena = Arena.ofConfined()) {
            MemorySegment point = arena.allocate(pointLayout);
            xHandle.set(point, 0L, 42);
            System.out.println("x = " + xHandle.get(point, 0L));
        }

        System.out.println("FFM API — 네이티브 접근 성공!");
    }
}
// 컴파일: javac --enable-preview --release 22 PanamaDemo.java
// 실행:   java  --enable-preview PanamaDemo

학습 팁

FFM API는 JNI보다 훨씬 안전하고 직관적입니다. Arena로 메모리 수명을 명시적으로 관리하므로 메모리 누수를 방지합니다.

주의할 점

FFM API는 Java 22에서 정식 기능이 됐습니다. 이전 버전에서는 --enable-preview 플래그가 필요합니다. 버전에 따라 API가 변경될 수 있습니다.

자주 묻는 질문

Project Panama & Foreign Function API (Java 22)란 무엇인가요?

Java 22의 Foreign Function & Memory API로 네이티브 라이브러리를 안전하게 호출합니다.

Project Panama & Foreign Function API (Java 22) 학습 시 주의할 점은 무엇인가요?

FFM API는 Java 22에서 정식 기능이 됐습니다. 이전 버전에서는 --enable-preview 플래그가 필요합니다. 버전에 따라 API가 변경될 수 있습니다.