我有一个代码,它使用Java Swing应用程序作为用户界面,但使用JavaScript文件进行一些硬件测试。应用程序调用JavaScript引擎以使用InvokeFunction()
方法从JavaScript调用函数。
现在我使用的是LabJack API,它只适用于Java而不适用于JavaScript。我有一个工作代码(我在Java上单独实现),但现在我需要JavaScript来调用该Java方法。
我的问题是,是否有一种方法可以从JS代码调用Java函数? 或换句话说, 如果在JS中有相同的方法可以做到这一点,
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
// JavaScript code in a String
String script1 = (String)"function hello(name) {print ('Hello, ' + name);}";
// evaluate script
engine.eval(script1);
Invocable inv = (Invocable) engine;
inv.invokeFunction("hello", "Scripting!!" );
为了进一步说明,我可以给出一个实际的例子。 JavaScript代码调用IR Toy将IR数据发送到灯光。现在我需要收集光产生的闪光次数。不幸的是,这只能使用Java(我已实现)来完成。所以现在我需要从Javascript调用这个Java方法,这样两个进程都可以在一个测试中。
答案 0 :(得分:2)
Java 8中的JavaScript引擎已从旧的Rhino更改为新的Nashorn,并且更改了创建Java对象的方法。
两者都应该有效的通用方法是使用Bindings
将Java对象传递给脚本。然后,JavaScript代码可以调用该对象的任何公共方法。
替代方案,将其作为参数传递。
示例使用Bindings
ArrayList<String> myList = new ArrayList<>();
myList.add("Hello");
Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
bindings.put("myList", myList);
String script1 = "function hello(name) {" +
" myList.add(name);" +
" print(myList);" +
"}";
engine.eval(script1);
Invocable inv = (Invocable)engine;
inv.invokeFunction("hello", "Scripting!!" );
示例使用参数
String script1 = "function hello(myList, name) {" +
" myList.add(name);" +
" print(myList);" +
"}";
engine.eval(script1);
ArrayList<String> myList = new ArrayList<>();
myList.add("Hello");
Invocable inv = (Invocable)engine;
inv.invokeFunction("hello", myList, "Scripting!!");
<强>输出强>
[Hello, Scripting!!]