如何从Javascript调用Java方法(非服务器)

时间:2016-03-21 23:10:08

标签: javascript java

我有一个代码,它使用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方法,这样两个进程都可以在一个测试中。

1 个答案:

答案 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!!]