从Rhino调用Java函数

时间:2016-09-29 13:04:39

标签: javascript java android rhino phonegap-cli

从Java中调用在Rhino中运行的Javascript函数很容易 - 毕竟这就是创建Rhino的原因。我遇到的问题是:

  • 上下文:我有一个Phonegap CLI(v 6.3.3)Android项目(API 19+),我通过在rhino中运行的可加载JavaScript进行大量处理
  • 我正在与实际的Phonegap应用同时创建的Phonegap插件包含名为Storage的类,它提供公共的静态方法,例如readFromFile(String fileName)writeToFile(String fileName,String data)
  • 我想要做的是从我在Rhino中加载的JavaScript代码中调用Storage.readFromFile等。

我应该如何做到这一点并不是很清楚。从我到目前为止所做的搜索来看,它涉及使用ScriptableObject.putProperty将有问题的Java类传递给我,Storage在我的情况下传递给JavaScript。但是,如何做到这一点以及如何在JS端使用它会让我感到困惑。

我非常感谢能够指出正确方向的人们

1 个答案:

答案 0 :(得分:2)

鉴于Rhino在这里的关注者少于100人,或许这个问题没有得到回答也许不足为奇。与此同时,我自己设法找到解决方案,结果证明非常简单。我在下面分享它,以便其他任何人遇到这个帖子。

我的Storage课很简单。它就是这样的

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

当我通过Rhino从Java调用Javascript时,我只是将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');
 ...
}
相关问题