Javascript 从Rhino调用Java函数

Javascript 从Rhino调用Java函数,javascript,java,android,rhino,phonegap-cli,Javascript,Java,Android,Rhino,Phonegap Cli,从Java调用Rhino内部运行的Javascript函数非常简单——这就是Rhino创建的原因。我难以确定的是: 上下文:我有一个Phonegap CLI(v6.3.3)Android项目(API 19+),通过rhino内部运行的可加载JavaScript进行大量处理 一个Phonegap插件——我与实际的Phonegap应用程序同时创建该插件——包含名为存储的类,该类提供公共的静态方法,如readFromFile(String fileName),writeToFile(String f

从Java调用Rhino内部运行的Javascript函数非常简单——这就是Rhino创建的原因。我难以确定的是:

  • 上下文:我有一个Phonegap CLI(v6.3.3)Android项目(API 19+),通过rhino内部运行的可加载JavaScript进行大量处理
  • 一个Phonegap插件——我与实际的Phonegap应用程序同时创建该插件——包含名为
    存储的类
    ,该类提供公共的静态方法,如
    readFromFile(String fileName)
    writeToFile(String fileName,String data)
  • 我希望能够从Rhino中加载的JavaScript代码中调用
    Storage.readFromFile
我不太清楚该怎么做。从我迄今为止所做的搜索来看,它涉及到使用
ScriptableObject.putProperty
将所讨论的Java类,
Storage
在我的例子中传递给JavaScript。然而,如何做到这一点以及如何在JS端使用它让我相当困惑


我将非常感谢在座的任何人,他们可能会为我指出正确的方向

鉴于犀牛在这里的追随者不到100人,这个问题得不到回答可能也就不足为奇了。与此同时,我自己设法找到了解决方案,结果证明非常简单。我在下面分享它,以方便其他遇到此线程的人

我的
存储
类非常简单。事情是这样的

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');
 ...
}

我注意到,这个问题最近获得了“热门问题”的称号。为了方便将来的访问者了解这个问题。Rhino是一项有20年历史的技术。您最好使用更现代的ES6兼容脚本引擎。有许多替代方案,如和。就原始性能而言,J2v*稍好一点,但这是有代价的——相当于APK的大小。我个人现在使用Duktape。按照Duktape的Squareup Github页面上的链接获取集成信息。