I am trying to acheve the following. A Java application should run a javascript via the ScriptEngineManager/ScriptEngine and the javascript should be able to call functions form the Java application. This works great as long as only a simple Variable is passed to and from. But I cannot get it to pass arrays. Here is my code:
private static class test implements Function<Integer[], Integer[]> {
@Override
public Integer[] apply(Integer[] msg) {
for(int i = 0; i < msg.length; i++) System.out.println(msg[i]);
Integer[] a = {1, 2, 3};
return a;
}
}
public static void main(String[] args) throws ScriptException {
String ps = "var e = [0x04, 0x05, 0x06]; var a = send(e); for(i in a) print(i);";
ScriptEngineManager sm = new ScriptEngineManager();
ScriptEngine eng = sm.getEngineByName("JavaScript");
Bindings mbind = eng.createBindings();
mbind.put("send", new test());
eng.setBindings(mbind, ScriptContext.ENGINE_SCOPE);
Object t = eng.eval(ps);
}
I get the error:
Exception in thread "main" java.lang.ClassCastException: jdk.nashorn.api.scripting.ScriptObjectMirror cannot be cast to [Ljava.lang.Integer; at scripttest$test.apply(scripttest.java:1) at jdk.nashorn.internal.scripts.Script$\^eval_.:program(:1) at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:637) at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:494) at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393) at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:446) at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:403) at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:399) at jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:155) at javax.script.AbstractScriptEngine.eval(Unknown Source) at scripttest.main(scripttest.java:26)
Does anyone have an idea on how to pass arrays?
Thanks! Regards
a's fields, not members -for(... in ...)is a syntax to iterate over fields of an object, so ifais indeed a 3 member array, the output would be0\n1\n2\nregardless of the array's content. The Javascript syntax for array iteration isfor(... of ...).