Rhino:如何从 Java 调用 JS 函数

Posted

技术标签:

【中文标题】Rhino:如何从 Java 调用 JS 函数【英文标题】:Rhino: How to call JS function from Java 【发布时间】:2011-04-29 02:18:03 【问题描述】:

我正在使用 Mozilla Rhino 1.7r2(不是 JDK 版本),我想从 Java 调用一个 JS 函数。

我的JS函数是这样的:

function abc(x,y)

  return x+y

我该怎么做?

编辑:(JS函数在一个单独的文件中)

【问题讨论】:

mozilla.org/rhino/tutorial.html#callingJSfuns @org 这个例子对我来说不是很清楚。 js文件的路径在哪里指定?我猜它假设我只需在 cmdline 中键入整个 JS 代码并将其作为 arg 传递给我的 java 应用程序! ^^" 【参考方案1】:
String script = "function abc(x,y) return x+y;";
Context context = Context.enter();
try 
    ScriptableObject scope = context.initStandardObjects();
    Scriptable that = context.newObject(scope);
    Function fct = context.compileFunction(scope, script, "script", 1, null);
    Object result = fct.call(
            context, scope, that, new Object[] 2, 3);
    System.out.println(Context.jsToJava(result, int.class));
 finally 
    Context.exit();

更新:当函数与其他函数和变量一起加载到作用域中时

String script = "function abc(x,y) return x+y;"
        + "function def(u,v) return u-v;";
Context context = Context.enter();
try 
    ScriptableObject scope = context.initStandardObjects();
    context.evaluateString(scope, script, "script", 1, null);
    Function fct = (Function)scope.get("abc", scope);
    Object result = fct.call(
            context, scope, scope, new Object[] 2, 3);
    System.out.println(Context.jsToJava(result, int.class));
 finally 
    Context.exit();

【讨论】:

在尝试阻止 context.setOptimizationLevel(-1); 之前不要忘记添加这个; @Maurice Perry 如果我想使用 [[1,3],[4,5],[6,9]] 等多维整数数组调用函数,那么我该如何传递 Object[] ? @SamirMangroliya 我猜你需要为每个内部数组调用 Context.newArray,然后再为外部数组调用一次。

以上是关于Rhino:如何从 Java 调用 JS 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 程序中调用 Rhino 编译的 JavaScript 方法(类文件)?

Rhino -> Node.js 通信

如何使用 Rhino 将 Java 类中的方法添加为 Javascript 中的全局函数?

使用 ScriptManager (Rhino) 从 Java 中使用 Javascript HTML5 类型数组,如何?

使用 require.js 和 Java/Rhino 解析模块

如何在Android平台上使用JS直接调用Java方法