javascript - 从 Rhino 调用 Java 函数

标签 javascript java android rhino phonegap-cli

从 Java 调用在 Rhino 中运行的 Javascript 函数非常简单 - 毕竟这就是创建 Rhino 的原因。我无法确定的是:

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

我不太清楚应该如何做到这一点。从我迄今为止所做的搜索来看,它涉及使用 ScriptableObject.putProperty 将有问题的 Java 类(在我的例子中为 Storage)传递给 JavaScript。然而,这应该如何完成,然后应该如何在 JS 端使用,这让我很困惑。

如果有人能给我指出正确的方向,我将不胜感激

最佳答案

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

关于javascript - 从 Rhino 调用 Java 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39771148/

相关文章:

javascript - Gulp 和注入(inject)路径

javascript - 提交时打开复选框多个选项卡

java - 在 Java 中使用值为 1 的 boolean 值

java.math.BigDecimal 到 Avro .avdl 文件

android - Cordova在android项目中添加插件很慢

javascript - 如何在动态(AJAX)生成的元素上创建滚动事件?

javascript - Impress.js 和 AngularJS Controller

java - 缓冲图像颜色操作

android - 如何使用自定义布局在布局中心对齐 TextView ?

java - 我的 ListView 不起作用。我在这里错过了一些东西