2017-02-08 4 views
0

Я использую Rhino для встраивания JS-кода в приложение Java (android). Мне нужна определенная функция, написанная на Java, чтобы вернуть функцию Java, которая будет вызываться позже Javascript. Чтобы поддерживать совместимость с реализацией iOS, это необходимо сохранить и сохранить в переменной функции JS. Я не могу понять, как вернуть объект Java, который рассматривается как функция JS из Javascript. Я думал, что ответом на это будет создание NativeJavaMethod, но когда я пытаюсь вызвать его в Javascript, он всегда говорит, что этот «указатель» неверен. Код, который я использовал, был:Хранение функции Javascript из переменной экземпляра Java

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)

(.. Кроме того, я даже пытался написания работоспособной в переменную 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

Я возвращаю его (сама эта функция вызывается из Javascript) хранить его в переменной JS, то вызов этой переменной. поэтому var x = SomeJavaMethodThatReturnsNativeObject(); Икс(); в JS –

ответ

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; 
    } 
} 
Смежные вопросы