我正在使用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
答案 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;
}
}