Project Panama は、Java とネイティブ コード間の接続を改善することを目的とした OpenJDK イニシアチブです。その主要なコンポーネントの 1 つは外部関数 & メモリ API であり、Java アプリケーションがネイティブ ライブラリおよびメモリと対話する方法を簡素化および強化します。
外部関数およびメモリ API を使用すると、Java プログラムがネイティブ関数を呼び出し、ネイティブ メモリを直接管理できるようになります。この API は、Java Native Interface (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(); } } }
この例では:
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); } } }
この例では:
Foreign Function & Memory API は Java エコシステムへの強力な追加機能であり、ネイティブ コードとメモリを操作するためのより安全で効率的かつ簡単な方法を提供します。ネイティブ関数を呼び出す必要がある場合でも、ネイティブ メモリを管理する必要がある場合でも、この API は Java アプリケーションの新しい可能性を開きます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3