如何使用Java GraalVM在Java代码和嵌入式WASM代码之间传递字符串作为参数和返回值

如何使用Java GraalVM在Java代码和嵌入式WASM代码之间传递字符串作为参数和返回值,java,rust,webassembly,graalvm,Java,Rust,Webassembly,Graalvm,我想将一个字符串作为参数从Java代码传递到WASM代码,并将一个字符串从WASM代码返回到Java。 以下内容没有说明如何做到这一点 Rust编译成example.wasm的示例代码: #[无损坏] 发布外部fn main()->*常量u8{ “你好,世界!”。as_ptr() } 使用GraalVM polyglot API嵌入WASM的Java代码: byte[]binary=readBytes(“example.wasm”); Context.Builder contextBuilde

我想将一个字符串作为参数从Java代码传递到WASM代码,并将一个字符串从WASM代码返回到Java。 以下内容没有说明如何做到这一点

Rust编译成
example.wasm
的示例代码:

#[无损坏]
发布外部fn main()->*常量u8{
“你好,世界!”。as_ptr()
}
使用GraalVM polyglot API嵌入WASM的Java代码:

byte[]binary=readBytes(“example.wasm”);
Context.Builder contextBuilder=Context.newBuilder(“wasm”);
Source.Builder sourceBuilder=Source.newBuilder(“wasm”,ByteSequence.create(二进制),“example”);
Source=sourceBuilder.build();
Context=contextBuilder.build();
context.eval(来源);
Value mainFunction=context.getBindings(“wasm”).getMember(“main”).getMember(“main”);
System.out.println(“返回:”+mainFunction.execute());
但是,运行此程序时,会打印以下内容:

Returned: 1048641
我希望这会打印
返回:Hello world

正在尝试
mainFunction.execute().asString()
throws

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)
调用
.execute()
应返回一个graalvm
对象,该对象可以是不同的类型。我想知道它是否返回一个非字符串值。如果对
.execute()
返回的值调用
.asString()
,会怎么样?它会抛出错误吗?返回的数字是可疑的,因为它的十六进制值是0x100041,看起来不是随机的