Jul 1, 2024
Jul 1, 2024
N/A Views
MD

ChicoryはJVM上のWebAssembly Runtimeです。
Javaのみで実装されており、Nativeライブラリ、JNIなしで利用できるのが特徴です。

Note

JNIを使用したJVM上のWasm Runtimeとしてはwasmtime-javaがあります。

以下の依存ライブラリを追加することでJavaアプリ上でwasmの読み込み・実行ができるようになります。

        <dependency>
            <groupId>com.dylibso.chicory</groupId>
            <artifactId>runtime</artifactId>
            <version>0.0.10</version>
        </dependency>

サンプルのwasmファイルをWATファイルから作ります。次のファイルSumSquared.watを作ります。

二つのi32のパラメータを加算して二乗した値を返します。

(module
  (func (export "SumSquared")
    (param $value_1 i32) (param $value_2 i32)
    (result i32)
    (local $sum i32)

    (i32.add (local.get $value_1) (local.get $value_2))
    local.set $sum
    (i32.mul (local.get $sum) (local.get $sum))
  )
)

Tip

入門WebAssemblyに掲載されているサンプルコードを使いました。

入門WebAssembly

wat2wasmでwasmに変換します。

wat2wasm SumSquared.wat 

SumSquared.wasmが生成されます。このwasmをJavaで読み込んで実行します。

package org.example;

import com.dylibso.chicory.runtime.ExportFunction;
import com.dylibso.chicory.runtime.Instance;
import com.dylibso.chicory.runtime.Module;
import com.dylibso.chicory.wasm.types.Value;

public class Main {
    public static void main(String[] args) {
        Module module = Module.builder("SumSquared.wasm").build();
        Instance instance = module.instantiate();

        ExportFunction iterFact = instance.export("SumSquared");
        Value result = iterFact.apply(Value.i32(2), Value.i32(3))[0];
        System.out.println("Result: " + result.asInt()); // should print "Result: 25" (= (2 + 3)^2)
    }
}

Javaアプリを実行します。

$ mvn -q compile exec:java -Dexec.mainClass=org.example.Main                   
Result: 25

全ソースコードはこちらです。

プラグイン機構をJavaアプリに組み込むのに良さそうです。

Found a mistake? Update the entry.
Share this article: