2017-02-08 12 views
0

Rhinoを使用してJSコードをJava(アンドロイド)アプリに埋め込みました。 Javascriptで後で呼ばれるJava関数を返すには、Javaで書かれた特定の関数が必要です。 iOS実装との互換性を維持するためには、これをJS関数変数に格納して保存する必要があります。私はJavascriptからJS関数として扱われるJavaオブジェクトを返す方法を理解できません。私はこれに対する答えはNativeJavaMethodを作ることだと思ったが、私はJavascriptで呼び出すときに "this"ポインタが間違っていると常に言います。私が使用したコードは次のとおりです。Javaインスタンス変数からJavascript関数を保存する

NativeJavaMethod("", runnable.getClass().getMethod("run"), scope); 

ここで、実行可能ファイルは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を格納し、Javaから復帰することをつかん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変数に格納する(この機能自体は、JavaScriptから呼ばれた)、それを返しています。ので、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; 
    } 
} 
関連する問題