◀戻る
GraalWasm を使用して Java に C を埋め込む
以下の例では、C 関数を WebAssembly にコンパイルして、Java アプリケーションに埋め込んで実行する方法を示します。
前提条件
デモを実行するには、以下が必要です。
デモ
- 次の C プログラムを floyd.c という名前のファイルに入れます。
#include <stdio.h> void floyd() { int number = 1; int rows = 10; for (int i = 1; i <= rows; i++) { for (int j = 1; j <= i; j++) { printf("%d ", number); ++number; } printf(".\n"); } } int main() { floyd(); return 0; }
floyd
は独立した関数として定義され、エクスポートできることに注意してください。 - Emscripten コンパイラフロントエンド の最新バージョンを使用して C コードをコンパイルします。
emcc --no-entry -s EXPORTED_FUNCTIONS=_floyd -o floyd.wasm floyd.c
エクスポートされる関数は
_
でプレフィックスを付ける必要があります。たとえば Java コード内でその関数を参照する場合、エクスポートされる名前にはアンダースコアを含めないでください。これにより、現在の作業ディレクトリにスタンドアロンのファイル floyd.wasm が生成されます。
-
依存関係を追加します。GraalVM SDK ポリグロット API は、Maven の依存関係として簡単に Java プロジェクトに追加できます。GraalWasm アーティファクトも Java モジュールまたはクラスパス上に存在する必要があります。次の依存関係をプロジェクト構成ファイル(Maven の場合は pom.xml)に追加します。
- ポリグロット API を追加するには
<dependency> <groupId>org.graalvm.polyglot</groupId> <artifactId>polyglot</artifactId> <version>${graalwasm.version}</version> </dependency>
- GraalWasm を追加するには
<dependency> <groupId>org.graalvm.polyglot</groupId> <artifactId>wasm</artifactId> <version>${graalwasm.version}</version> <type>pom</type> </dependency>
- ポリグロット API を追加するには
-
これで、たとえば次の WebAssembly 関数を Java アプリケーションに埋め込むことができます。
import org.graalvm.polyglot.*; import org.graalvm.polyglot.io.ByteSequence; // Load the WebAssembly contents into a byte array byte[] binary = Files.readAllBytes(Path.of("path", "to", "wasm", "file", "floyd.wasm")); // Setup context Context.Builder contextBuilder = Context.newBuilder("wasm").option("wasm.Builtins", "wasi_snapshot_preview1"); Source.Builder sourceBuilder = Source.newBuilder("wasm", ByteSequence.create(binary), "example"); Source source = sourceBuilder.build(); Context context = contextBuilder.build(); // Evaluate the WebAssembly module context.eval(source); // Execute the floyd function context.getBindings("wasm").getMember("example").getMember("_initialize").executeVoid(); Value mainFunction =context.getBindings("wasm").getMember("example").getMember("floyd"); mainFunction.execute(); context.close();
- 通常どおり、Maven を使用してこの Java アプリケーションをコンパイルして実行します。