【发布时间】: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 上工作。