戻る

GraalWasm を使用して Java に C を埋め込む

以下の例では、C 関数を WebAssembly にコンパイルして、Java アプリケーションに埋め込んで実行する方法を示します。

前提条件

デモを実行するには、以下が必要です。

デモ

  1. 次の 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 は独立した関数として定義され、エクスポートできることに注意してください。

  2. Emscripten コンパイラフロントエンド の最新バージョンを使用して C コードをコンパイルします。
     emcc --no-entry -s EXPORTED_FUNCTIONS=_floyd -o floyd.wasm floyd.c
    

    エクスポートされる関数は _ でプレフィックスを付ける必要があります。たとえば Java コード内でその関数を参照する場合、エクスポートされる名前にはアンダースコアを含めないでください。

    これにより、現在の作業ディレクトリにスタンドアロンのファイル floyd.wasm が生成されます。

  3. 依存関係を追加します。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>
      
  4. これで、たとえば次の 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();
    
  5. 通常どおり、Maven を使用してこの Java アプリケーションをコンパイルして実行します。

お問い合わせ