【问题标题】:Storing a Javascript function from a Java instance variable从 Java 实例变量存储 Javascript 函数
【发布时间】:2017-02-08 21:12:45
【问题描述】:

我正在使用 Rhino 将 JS 代码嵌入到 Java (android) 应用程序中。我需要一个用 Java 编写的函数来返回一个 Java 函数,以便稍后由 Javascript 调用。为了保持与 iOS 实现的兼容性,这需要存储并保存在一个 JS 函数变量中。我不知道如何从 Javascript 返回一个被视为 JS 函数的 Java 对象。我认为这个问题的答案是创建一个 NativeJavaMethod,但是当我尝试在 Javascript 中调用一个时,它总是说“this”指针是错误的。我使用的代码是:

NativeJavaMethod("", runnable.getClass().getMethod("run"), scope);

其中 runnable 是 Runnable,scope 是顶级范围。必须有办法做到这一点,我做错了什么?我猜它的范围,但我不知道它想要什么。

确切消息:org.mozilla.javascript.EvaluatorException: Java method "run" was invoked with [object Object] as "this" value that can not be converted to Java type java.lang.Runnable. (#1)

(我什至还尝试将 runnable 写入 JS 变量,然后将 runnable.run 存储在变量中并从 Java 中获取返回。同样的问题。)

编辑:

NativeJavaMethod 从 Java 函数返回给调用者(用 JavaScript 编写),存储在变量中,然后执行。所以在 JS 中

var x=myobject.makeFunction();  //makeFunction is in Java, is properly called and returns the NativeJavaMethod
x();  //This throws the above exception

【问题讨论】:

  • 我正在返回它(这个函数本身是从 Javascript 调用的)将它存储在一个 JS 变量中,然后调用那个变量。所以 var x=SomeJavaMethodThatReturnsNativeObject(); X();在 JS 中

标签: javascript java rhino


【解决方案1】:

我找到了一种方法,方法是创建一个扩展BaseFunction 的对象并覆盖call 函数以在我要运行的对象上调用runnable.run()。我可以通过使其采用实例和方法来进一步概括它,但目前我不需要它。我仍然对更好/内置的答案感兴趣,但这确实有效:

public static class WrapperRunnableFunction extends BaseFunction {
    Runnable runnable;
    WrapperRunnableFunction(Runnable runnable) {
        this.runnable = runnable;
    }

    @Override
    public Object call(Context cx, Scriptable scope, Scriptable thisObj, java.lang.Object[] args) {
        runnable.run();
        return null;
    }
}

【讨论】:

    猜你喜欢
    • 2019-11-03
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    相关资源
    最近更新 更多