--- title: ChicoryでJavaからWebAssemblyを呼び出すメモ tags: ["Java", "WebAssembly", "Chicory"] categories: ["Programming", "WebAssembly", "Java", "Chicory"] date: 2024-07-01T09:09:40Z updated: 2024-07-01T14:35:37Z --- [Chicory](https://github.com/dylibso/chicory)はJVM上のWebAssembly Runtimeです。 Javaのみで実装されており、Nativeライブラリ、JNIなしで利用できるのが特徴です。 > [!NOTE] > JNIを使用したJVM上のWasm Runtimeとしては[wasmtime-java](https://github.com/kawamuray/wasmtime-java)があります。 以下の依存ライブラリを追加することでJavaアプリ上でwasmの読み込み・実行ができるようになります。 ```xml com.dylibso.chicory runtime 0.0.10 ``` サンプルのwasmファイルをWATファイルから作ります。次のファイル`SumSquared.wat`を作ります。 二つのi32のパラメータを加算して二乗した値を返します。 ```lisp (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](https://www.amazon.co.jp/%E5%85%A5%E9%96%80WebAssembly-Rick-Battagline-ebook/dp/B09MQ6CSBG?crid=2F88E3ZRLB9ML&keywords=webassembly&qid=1688271177&sprefix=WebAssembly%2Caps%2C260&sr=8-6&linkCode=li2&tag=ikam-22&linkId=9a9576034b15b62f172d59f69c3f1784&language=ja_JP&ref_=as_li_ss_il)に掲載されているサンプルコードを使いました。 > > [![入門WebAssembly](https://github.com/making/blog.ik.am/assets/106908/0825cd6a-05f9-4d3a-9e7e-8c3be783709c)](https://www.amazon.co.jp/%E5%85%A5%E9%96%80WebAssembly-Rick-Battagline-ebook/dp/B09MQ6CSBG?crid=2F88E3ZRLB9ML&keywords=webassembly&qid=1688271177&sprefix=WebAssembly%2Caps%2C260&sr=8-6&linkCode=li2&tag=ikam-22&linkId=9a9576034b15b62f172d59f69c3f1784&language=ja_JP&ref_=as_li_ss_il) `wat2wasm`でwasmに変換します。 ``` wat2wasm SumSquared.wat ``` `SumSquared.wasm`が生成されます。このwasmをJavaで読み込んで実行します。 ```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 ``` 全ソースコードは[こちら](https://github.com/making/hello-chicory)です。 プラグイン機構をJavaアプリに組み込むのに良さそうです。