"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 외부 함수 및 메모리 API 소개(프로젝트 파나마)

외부 함수 및 메모리 API 소개(프로젝트 파나마)

2024-08-06에 게시됨
검색:953

Introduction to the Foreign Function & Memory API (Project Panama)

Project Panama는 Java와 네이티브 코드 간의 연결 개선을 목표로 하는 OpenJDK 이니셔티브입니다. 핵심 구성 요소 중 하나는 Java 애플리케이션이 기본 라이브러리 및 메모리와 상호 작용하는 방식을 단순화하고 향상시키는 Foreign Function & Memory API입니다.

외부 함수 및 메모리 API란 무엇입니까?

외부 함수 및 메모리 API를 사용하면 Java 프로그램이 기본 함수를 호출하고 기본 메모리를 직접 관리할 수 있습니다. 이 API는 JNI(Java Native Interface)가 필요한 작업을 수행하는 더 안전하고 효율적인 방법을 제공합니다.

외부 함수 및 메모리 API의 이점

  1. 안전: API에는 메모리 누수, 버퍼 오버플로 등 네이티브 코드와 관련된 일반적인 오류를 방지하는 안전 기능이 포함되어 있습니다.
  2. 성능: API는 네이티브 기능과 메모리에 대한 직접 액세스를 허용함으로써 네이티브 라이브러리와 상호 작용해야 하는 Java 애플리케이션의 성능을 크게 향상시킬 수 있습니다.
  3. 단순성: API는 JNI에 비해 네이티브 코드 호출 프로세스를 단순화하여 상용구를 줄이고 코드 유지 관리를 더 쉽게 만듭니다.

외부 함수 및 메모리 API 사용

다음은 Foreign Function & Memory API를 사용하여 기본 함수를 호출하는 방법의 예입니다.

  1. 기본 함수 서명 정의

먼저 호출하려는 네이티브 함수의 시그니처를 정의해야 합니다. 다음 함수를 가진 C 라이브러리가 있다고 가정합니다:

// native.c
#include 

void sayHello() {
    printf("Hello from C!\n");
}
  1. 네이티브 라이브러리 로드 및 함수 호출
import jdk.incubator.foreign.*;

public class ForeignFunctionExample {
    public static void main(String[] args) {
        try (var session = MemorySession.openConfined()) {
            SymbolLookup lookup = SymbolLookup.loaderLookup();
            var sayHello = lookup.find("sayHello").orElseThrow();

            var sayHelloHandle = CLinker.getInstance().downcallHandle(
                sayHello,
                FunctionDescriptor.ofVoid()
            );

            sayHelloHandle.invokeExact();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
}

이 예에서는:

  • SymbolLookup을 사용하여 로드된 네이티브 라이브러리에서 sayHello 함수를 찾습니다.
  • CLinker를 사용하여 함수에 대한 핸들을 만듭니다.
  • 핸들을 사용하여 기본 함수를 호출합니다.

네이티브 메모리 관리

Foreign Function & Memory API를 사용하면 기본 메모리를 안전하게 관리할 수도 있습니다. 예는 다음과 같습니다.

import jdk.incubator.foreign.*;

public class MemoryManagementExample {
    public static void main(String[] args) {
        try (var session = MemorySession.openConfined()) {
            MemorySegment segment = MemorySegment.allocateNative(100, session);

            MemoryAccess.setByteAtOffset(segment, 0, (byte) 42);
            byte value = MemoryAccess.getByteAtOffset(segment, 0);

            System.out.println("Value: "   value);
        }
    }
}

이 예에서는:

  • 기본 메모리 블록을 할당합니다.
  • 할당된 메모리에서 바이트를 쓰고 읽습니다.
  • 세션이 닫히면 메모리 할당이 자동으로 해제됩니다.

결론

외부 함수 및 메모리 API는 Java 생태계에 추가된 강력한 기능으로, 네이티브 코드 및 메모리와 상호 작용하는 더 안전하고 효율적이며 쉬운 방법을 제공합니다. 네이티브 함수를 호출해야 하거나 네이티브 메모리를 관리해야 하는 경우 이 API는 Java 애플리케이션에 대한 새로운 가능성을 열어줍니다.

릴리스 선언문 이 기사는 https://dev.to/adaumircosta/introduction-to-the-foreign-function-memory-api-project-panama-20c8?1에서 복제됩니다. 침해가 있는 경우에는 [email protected]으로 문의하시기 바랍니다. 그것을 삭제하려면
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3