【问题标题】:Running JS script from Java code in GraalVM native-image在 GraalVM native-image 中从 Java 代码运行 JS 脚本
【发布时间】:2018-08-05 12:56:46
【问题描述】:

我正在尝试从 GraalVM 原生映像中的 Java 代码运行 JS 脚本。

Java 代码如下所示:

try (Context context = Context.create("js")) {
    Value bindings = context.getBindings("js");
    bindings.putMember("response", response);
    bindings.putMember("UTF8", StandardCharsets.UTF_8);
    context.eval("js", script);
} catch (PolyglotException e) {
    error("Error: " + e, 10);
}

JS 代码只是尝试通过调用response 对象上的方法来使用它,例如:

 print("Status code: " + response.getStatusCode());

这在 GraalVM 中运行时有效,但在创建本机映像时,它会失败并出现以下错误:

INVOKE on JavaObject[...] failed due to: Message not supported: INVOKE

如果我只是像print("Response: " + response); 那样打印对象,它不会失败。但是,如果我尝试在 response 上调用任何方法,我会收到此错误(甚至是 toString()hashCode())。

我还有什么需要做的吗,或者这只是 SubstractVM native-image 中的一个错误,目前?

我的 GraalVM 版本:

java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
GraalVM 1.0.0-rc4 (build 25.71-b01-internal-jvmci-0.45, mixed mode)

我正在使用的本地图像命令:

native-image --language:js --report-unsupported-elements-at-runtime -jar my.jar

【问题讨论】:

  • 我进行了更多调查,发现我使用的 GraalVM API 错误。我应该使用getPolyglotBindings() 而不是getBindings("js"),并且应该在使用response 之前在JS 端执行response = Polyglot.import('response');... 不过,它不能在native-image 中工作,只能在普通的GraalVM 上工作。

标签: java graalvm


【解决方案1】:

更新:从 RC 13 开始,现在支持使用本机映像进行反射访问。您需要为原生图像提供反射配置。

不幸的是,从 RC5 开始,GraalVM 在使用 native-image 编译时还不支持对 Java 对象的反射访问。我们计划在下一个候选版本中支持这一点。

作为临时解决方法,您可以像这样使用代理 API:

try (Context context = Context.create("js")) {
    Map<String, Object> myObject = new HashMap<>();
    myObject.put("foo", "bar");
    context.getBindings("js").putMember("hostObject", ProxyObject.fromMap(myObject));
    assert "bar".equals(context.eval("js", "hostObject.foo").asString());
    myObject.put("foo", "baz");
    assert "baz".equals(context.eval("js", "hostObject.foo").asString());
}

代理 API 允许模仿来宾语言值。

这是另一个代理示例:http://www.graalvm.org/docs/graalvm-as-a-platform/embed/#computed-arrays-using-polyglot-proxies

代理 Javadoc:http://www.graalvm.org/sdk/javadoc/org/graalvm/polyglot/proxy/package-summary.html

【讨论】:

猜你喜欢
  • 2021-12-05
  • 2017-01-22
  • 2018-09-08
  • 2020-07-22
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多