2016-09-29 110 views
0

調用Java在Rhino中運行的Javascript函數非常簡單 - 畢竟是爲什麼創建Rhino。我有麻煩建立事情是這樣的:從Rhino調用Java函數

  • 語境:我有一個PhoneGap的CLI(V 6.3.3)Android項目(API 19+),我通過加載JavaScript的運行做處理大量裏面犀牛
  • 一個PhoneGap的插件 - 這我創造在同一時間與實際的PhoneGap應用程序 - 包含類稱爲Storage,向公衆提供,靜態方法,如readFromFile(String fileName)writeToFile(String fileName,String data)
  • 我希望能夠有什麼要做的就是從Rhino加載的JavaScript代碼中調用Storage.readFromFile等。

這應該怎麼做對我來說不太清楚。從我迄今爲止所做的搜索來看,它涉及到使用ScriptableObject.putProperty來傳遞所討論的Java類,Storage在我的情況下是JavaScript。然而,如何做到這一點,以及如何在JS結束時使用它,讓我相當困惑。

我將不勝感激任何人在這裏誰可能能夠指出我在正確的方向

回答

1

鑑於犀牛在這裏有不到100米的追隨者也許應來並不令人意外,這個問題不好回答。同時我自己也找到了解決方案,結果非常簡單。我在下面分享它,以便其他任何人進入此主題。

我的Storage類很簡單。它是這樣的

public class Storage 
{ 
public static boolean haveFile(){} 
public static boolean readFromFile(String fname){} 
... 
} 

當我通過犀牛調用JavaScript從Java我簡單地傳遞Storage類的新實例作爲最後我的函數的參數

Context rhino = Context.enter(); 
Object[] functionParams = new Object[] {"Other parameters",new Storage()}; 
rhino.setOptimizationLevel(-1); 
try 
{ 
Scriptable scope = rhino.initStandardObjects(); 
String rhinoLog = "var log = Packages.io.vec.ScriptAPI.log;"; 
String code = /*Javascript code here* as shown separately below/; 
rhino.evaluateString(scope, rhinoLog + code, "ScriptAPI", 1, null); 
Function function = (Function) scope.get("jsFunction", scope); 
Object jsResult = function.call(rhino,scope,scope,functionParams); 
} 

在JavaScript代碼

function jsFunction(a,s) 
{ 
//a - or a,b,c etc - here will be the "other" parameters 
//s - will be the instance of the Java side Storage class passed above 
//now you can do things like 
s.writeToFile('fileName','fileData'); 
var fd = s.readFromFile('fileName'); 
s.dropFile('fileName'); 
... 
}