从 Java 实例变量存储 Java 脚本函数

Storing a Javascript function from a Java instance variable

我正在使用 Rhino 将 JS 代码嵌入到 Java (android) 应用程序中。我需要用 Java 编写的某个函数到 return 一个 Java 函数,稍后由 Java 脚本调用。为了保持与iOS实现的兼容性,这需要存储并保存在一个JS函数变量中。我不知道如何从 Java 脚本中 return 一个被视为 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 抓取到 return。同样的问题。)

编辑:

NativeJavaMethod 是从 Java 函数 returned 到调用者(用 JavaScript 编写),存储在一个变量中,然后后来被处决。所以在 JS

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

我找到了一种方法,方法是创建一个扩展 BaseFunction 的对象并覆盖 call 函数以在我想要 [=17] 的对象上调用 runnable.run() =].我可以通过使它采用实例和方法来进一步泛化它,但目前我不需要它。我仍然对 better/built 的答案感兴趣,但这确实有效:

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;
    }
}