从Java实例变量

时间:2017-02-08 21:12:46

标签: javascript java rhino

我正在使用Rhino将JS代码嵌入Java(android)应用程序中。我需要用Java编写的某个函数来返回稍后由Javascript调用的Java函数。为了保持与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

1 个答案:

答案 0 :(得分: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;
    }
}