2

GWTを使用して、クライアント側のみのライブラリを作成しています。JSNIを使用して関数を呼び出すのはJSのJavaです。問題は、要素または関数ハンドラーを渡そうとしているのに、何も起こらないように見えることです。GWTまたはjsから例外は発生しません。これが私のJSNI関数とブリッジです。

public static String testMe(Object obj) 
  {
      return "Response to " + obj.toString();     
  }

  public static native void defineBridgeMethod() /*-{
     $wnd.testMe = function(msg) {
        return @com.mycompany.mywebapp.client.MyWebApp::testMe(Ljava/lang/Object;);
     };

  }-*/;

ありがとう!

4

2 に答える 2

4

を使用していません。msgパラメータとして関数を呼び出すことを意味しますか?

public static native void defineBridgeMethod() /*-{
  $wnd.testMe = $entry(function(msg) {
    return @com.mycompany.mywebapp.client.MyWebApp::testMe(Ljava/lang/Object;)(msg);
  });
}-*/;

または、関数をウィンドウに直接割り当てることができます。

public static native void defineBridgeMethod() /*-{
  $wnd.testMe = $entry(
    @com.mycompany.mywebapp.client.MyWebApp::testMe(Ljava/lang/Object;)
  );
}-*/;
于 2012-11-29T23:24:33.920 に答える
2

gwtプロジェクトをjsにエクスポートする最も簡単な方法は、gwt-exporterを使用することです。Gwtexporterを使用すると、jsniコードを1行も記述せずに、任意のgwtプロジェクトをエクスポートできます。また、jsに公開されるクラスとメソッドをカスタマイズできる機能が豊富にあり、jsapiのドキュメントを作成することもできます。

あなたの場合、静的メソッドを使用してクラスにインターフェースを実装し、Exportableメソッドにアノテーションを付けます。

public class MyClass implements Exportable {
  @Export("$wnd.testMe")
  public static String testMe(Object obj)  {
    return "Response to " + obj.toString();     
  }
}

次にexportAll()、エントリポイントでメソッドを呼び出し、gwtコンパイラとgwtexporterジェネレータに魔法をかける必要があります。

public void onModuleLoad() {
  ExporterUtil.exportAll();
}

ここに、gwt-libraryをjsにエクスポートする方法のチュートリアルがありますが、プロジェクトのドキュメントは非常に優れています。

この手法を使用するプロジェクトには、クロノスコープgwtupload(jsupload)gwtquery(jsquery )などがあります。

于 2012-11-30T08:52:53.217 に答える