java - 如何使用 Java GraalVM 在 Java 代码和嵌入式 WASM 代码之间将字符串作为参数传递和返回值
问题描述
我想将一个字符串作为参数从 Java 代码传递给 WASM 代码,并将一个字符串从 WASM 代码返回给 Java。遵循GraalVM WASM 参考并没有显示如何做到这一点。
编译成的 Rust 示例代码example.wasm
:
#[no_mangle]
pub extern fn main() -> *const u8 {
"Hello world!".as_ptr()
}
使用 GraalVM 多语言 API 嵌入 WASM 的 Java 代码:
byte[] binary = readBytes("example.wasm");
Context.Builder contextBuilder = Context.newBuilder("wasm");
Source.Builder sourceBuilder = Source.newBuilder("wasm", ByteSequence.create(binary), "example");
Source source = sourceBuilder.build();
Context context = contextBuilder.build();
context.eval(source);
Value mainFunction = context.getBindings("wasm").getMember("main").getMember("main");
System.out.println("Returned: " + mainFunction.execute());
但是,在运行此程序时会打印以下内容:
Returned: 1048641
我希望这能打印出来Returned: Hello world!
尝试mainFunction.execute().asString()
投掷
Exception in thread "main" java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)
Caused by: java.lang.ClassCastException: Cannot convert '1048641'(language: Java, type: java.lang.Integer) to Java type 'java.lang.String' using Value.asString(): Invalid coercion. You can ensure that the value can be converted using Value.isString().
at org.graalvm.truffle/com.oracle.truffle.polyglot.PolyglotEngineException.classCast(PolyglotEngineException.java:154)
at org.graalvm.truffle/com.oracle.truffle.polyglot.PolyglotValue.cannotConvert(PolyglotValue.java:1261)
at org.graalvm.truffle/com.oracle.truffle.polyglot.PolyglotValue.invalidCastPrimitive(PolyglotValue.java:686)
at org.graalvm.truffle/com.oracle.truffle.polyglot.PolyglotValue.asStringUnsupported(PolyglotValue.java:658)
at org.graalvm.truffle/com.oracle.truffle.polyglot.PolyglotValue.asString(PolyglotValue.java:649)
at org.graalvm.truffle/com.oracle.truffle.polyglot.PolyglotValue$PrimitiveValue.asString(PolyglotValue.java:4016)
at org.graalvm.sdk/org.graalvm.polyglot.Value.asString(Value.java:952)
at org.example.wasmhost.WasmHostApplication.main(WasmHostApplication.java:63)
... 8 more
我的Java是:
$ java -version
openjdk version "11.0.11" 2021-04-20
OpenJDK Runtime Environment GraalVM CE 21.1.0 (build 11.0.11+8-jvmci-21.1-b05)
OpenJDK 64-Bit Server VM GraalVM CE 21.1.0 (build 11.0.11+8-jvmci-21.1-b05, mixed mode, sharing)
解决方案
推荐阅读
- swiftui - 如何将 HStack 中的视图移动到其他视图的顶部
- python - 在 Python 中绘制文本数据的 KMeans 聚类
- java - JDA 不会注册我的活动(Discord Bot Java)
- sql - SQL查询多对多:查找给定集合中包含所有标签的所有项目
- c - 嵌入式系统:MSP430g2553 IAR 编程端口/引脚 BASIC 输入/输出语法
- javascript - Pg-promise:更改 db.task() 中的 search_path 是否也会更改外部运行的查询?
- powershell - 将计算机添加到我们的域的脚本失败
- python - 以特定顺序从两个 dfs 中获取列并创建一个新的 df
- netlogo - 保存模型运行的结果以用作未来运行的起点
- rpm - 无法在 AIX 上 rpm 卸载软件包