从 Rhino 调用 Java 函数
Calling Java function from Rhino
从 Java 调用 Rhino 内部的 Java 脚本函数 运行 非常简单 - 毕竟这就是创建 Rhino 的原因。我无法确定的是:
- Context: 我有一个 Phonegap CLI (v 6.3.3) Android 项目 (API 19+) 我做了很多通过 rhino
中的可加载 JavaScript 运行 处理
- 一个 Phonegap 插件——我与实际的 Phonegap 应用程序同时创建——包含名为
Storage
的 class,它提供 public、静态方法,例如 readFromFile(String fileName)
、writeToFile(String fileName,String data)
等
- 我想要做的是从我在 Rhino 中加载的 Java 脚本代码调用
Storage.readFromFile
等。
我不太清楚应该怎么做。从我到目前为止所做的搜索来看,它涉及使用 ScriptableObject.putProperty
将有问题的 Java class 传递给 JavaScript,在我的例子中是 Storage
。但是,这应该如何完成,然后应该如何在 JS 端使用,这让我很困惑。
如果有人能给我指出正确的方向,我将不胜感激
鉴于 Rhino 在这里的关注者不到 100 人,这个问题没有得到回答应该不足为奇。与此同时,我自己设法找到了解决方案,事实证明它非常简单。为了其他人的利益,我在下面分享它 运行 到这个线程。
我的Storage
class很简单。它是这样的
public class Storage
{
public static boolean haveFile(){}
public static boolean readFromFile(String fname){}
...
}
当我通过 Rhino 从 Java 调用 Java 脚本时,我只是将 Storage
class 的一个新实例作为函数参数的最后一个
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);
}
其中 Java 脚本代码是
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');
...
}
从 Java 调用 Rhino 内部的 Java 脚本函数 运行 非常简单 - 毕竟这就是创建 Rhino 的原因。我无法确定的是:
- Context: 我有一个 Phonegap CLI (v 6.3.3) Android 项目 (API 19+) 我做了很多通过 rhino 中的可加载 JavaScript 运行 处理
- 一个 Phonegap 插件——我与实际的 Phonegap 应用程序同时创建——包含名为
Storage
的 class,它提供 public、静态方法,例如readFromFile(String fileName)
、writeToFile(String fileName,String data)
等 - 我想要做的是从我在 Rhino 中加载的 Java 脚本代码调用
Storage.readFromFile
等。
我不太清楚应该怎么做。从我到目前为止所做的搜索来看,它涉及使用 ScriptableObject.putProperty
将有问题的 Java class 传递给 JavaScript,在我的例子中是 Storage
。但是,这应该如何完成,然后应该如何在 JS 端使用,这让我很困惑。
如果有人能给我指出正确的方向,我将不胜感激
鉴于 Rhino 在这里的关注者不到 100 人,这个问题没有得到回答应该不足为奇。与此同时,我自己设法找到了解决方案,事实证明它非常简单。为了其他人的利益,我在下面分享它 运行 到这个线程。
我的Storage
class很简单。它是这样的
public class Storage
{
public static boolean haveFile(){}
public static boolean readFromFile(String fname){}
...
}
当我通过 Rhino 从 Java 调用 Java 脚本时,我只是将 Storage
class 的一个新实例作为函数参数的最后一个
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);
}
其中 Java 脚本代码是
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');
...
}