2016-03-21 44 views
0

我有一個代碼,它爲用戶界面使用Java Swing應用程序,但使用JavaScript文件來進行一些硬件測試。應用程序使用InvokeFunction()方法調用JavaScript引擎來調用JavaScript中的函數。如何從Javascript(非服務器)調用Java方法

現在我使用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將紅外數據發送到指示燈。現在我需要收集光線產生的閃光次數。不幸的是,這隻能使用Java(我已經實現)完成。所以現在我需要從Javascript中調用這個Java方法,以便兩個進程都可以在一個測試中。

+0

JavaScript引擎瓦特

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!!"); 

實施例在Java 8中從舊的* Rhino *更改爲新的* Nashorn *,並且創建Java對象的方式發生了變化。一個通用的方式應該可以在兩者中工作,就是使用'Bindings'將Java對象傳遞給腳本。 JavaScript代碼然後可以調用該對象的任何公共方法。 – Andreas

+0

你能在答案部分給出任何例子嗎?如何使用綁定? –

回答

1

JavaScript引擎在Java 8中從舊的Rhino更改爲新的Nashorn,並且創建Java對象的方式也發生了變化。

應該同時工作的通用方法是使用Bindings將Java對象傳遞給腳本。 JavaScript代碼然後可以調用該對象的任何公共方法。

可選,將其作爲參數傳入。

實施例使用綁定使用參數

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!!"); 

OUTPUT

[Hello, Scripting!!] 
+0

感謝安德烈亞斯,它幫助:) –

相關問題