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가 변경될 수 있습니다.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.