【问题标题】:Calling Java function from Rhino从 Rhino 调用 Java 函数
【发布时间】:2016-09-29 13:04:39
【问题描述】:

从 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 端应该如何使用,这让我很困惑。

我将非常感谢这里的任何人能够指出我正确的方向

【问题讨论】:

    标签: javascript java android rhino phonegap-cli


    【解决方案1】:

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

    【讨论】:

    • 我注意到这个问题最近获得了“热门问题”徽章。为了这个问题的未来访问者的利益。 Rhino 是 20 年的技术。您最好使用更现代的 ES6 兼容脚本引擎。有很多替代方案,例如DuktapeJ2V8。就原始性能而言,J2v* 稍好一些,但这是有代价的——APK 的大小。我个人现在使用 Duktape。按照 Duktape 的 Squareup Github 页面上的链接获取集成信息。
    猜你喜欢
    • 2011-04-29
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多