2017-02-08 3 views
0

Rhino를 사용하여 Java (android) app에 JS 코드를 포함시키고 있습니다. 나중에 Javascript에서 호출 할 Java 함수를 반환하려면 Java로 작성된 특정 함수가 필요합니다. iOS 구현과의 호환성을 유지하려면 JS 함수 변수에 저장하고 저장해야합니다. Javascript에서 JS 함수로 취급되는 Java 객체를 반환하는 방법을 알 수 없습니다. 나는 이것에 대한 답이 NativeJavaMethod를 만드는 것이라고 생각했지만, 자바 스크립트를 호출하려고 할 때 "this"포인터가 잘못되었다고 항상 말합니다. 내가 사용한 코드는 다음과 같습니다.Java 인스턴스 변수에서 Javascript 함수 저장

여기서 runnable은 Runnable이고 범위는 최상위 범위입니다. 이 일을 할 수있는 방법이 있어야합니다, 내가 뭘 잘못하고 있니? 나는 그 범위를 추측하고 있지만 그것이 무엇을 원하는지 모르겠다.

정확한 메시지 : 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.run를 저장하고 자바에서 반환하는 것을 잡는 JS 변수로 실행 가능한를 작성 같은 문제를 시도)

편집 :

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

나는 그것을 반환하고있어이 그 변수를 호출하는 JS 변수에 저장 (이 기능 자체가 자바 스크립트에서 호출되었다). 그래서 var x = SomeJavaMethodThatReturnsNativeObject(); 엑스(); JS –

답변

1

에 나는 BaseFunction를 확장하는 객체를 생성하고 난 실행하려는 개체에() runnable.run 호출 할 call 기능을 재정 의하여 그것을 할 수있는 방법을 발견했다. 인스턴스와 메서드를 사용하여이를 더 생성 할 수는 있지만 지금은 필요하지 않습니다. 나는 대답 내장/더 나은 여전히 ​​관심이 있지만,이 작업을 수행합니다

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