」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 外部函數和記憶體 API 簡介(巴拿馬專案)

外部函數和記憶體 API 簡介(巴拿馬專案)

發佈於2024-08-06
瀏覽:208

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

巴拿馬專案是一項 OpenJDK 計劃,旨在改善 Java 和本機程式碼之間的連接。它的關鍵元件之一是外部函數和記憶體 API,它簡化並增強了 Java 應用程式與本機庫和記憶體互動的方式。

什麼是外部函數和記憶體 API?

Foreign Function & Memory API 允許 Java 程式呼叫本機函數並直接管理本機記憶體。此 API 提供了一種更安全、更有效的方法來執行原本需要 Java 本機介面 (JNI) 的操作。

外部函數和記憶體 API 的優點

  1. 安全性:API 包含安全功能,可防止與本機代碼相關的常見錯誤,例如記憶體洩漏和緩衝區溢位。
  2. 效能:透過允許直接存取本機函數和內存,API 可以顯著提高需要與本機庫互動的 Java 應用程式的效能。
  3. 簡單:與JNI相比,API簡化了呼叫本機程式碼的過程,減少了樣板程式碼,使程式碼更易於維護。

使用外部函數和記憶體 API

以下是如何使用外部函數和記憶體 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 建立函數的句柄。
  • 我們使用句柄呼叫本機函數。

管理本機記憶體

外部函數和記憶體 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);
        }
    }
}

在此範例中:

  • 我們分配一塊本機記憶體。
  • 我們從分配的記憶體中寫入和讀取一個位元組。
  • 會話關閉時,記憶體會自動釋放。

結論

Foreign Function & Memory 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