巴拿馬專案是一項 OpenJDK 計劃,旨在改善 Java 和本機程式碼之間的連接。它的關鍵元件之一是外部函數和記憶體 API,它簡化並增強了 Java 應用程式與本機庫和記憶體互動的方式。
Foreign Function & Memory API 允許 Java 程式呼叫本機函數並直接管理本機記憶體。此 API 提供了一種更安全、更有效的方法來執行原本需要 Java 本機介面 (JNI) 的操作。
以下是如何使用外部函數和記憶體 API 呼叫本機函數的範例:
首先,您需要定義要呼叫的本機函數的簽章。假設我們有一個具有以下函數的 C 庫:
// native.c #includevoid sayHello() { printf("Hello from C!\n"); }
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(); } } }
在此範例中:
外部函數和記憶體 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 應用程式開闢了新的可能性。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3