2012-11-29 115 views
1

我正在使用GWT創建僅客戶端的庫。我使用JSNI來調用函數是來自JS的Java。問題是我試圖傳入一個元素或函數處理程序,似乎沒有任何事情發生。我沒有從GWT或JS獲得例外。這是我的JSNI功能與橋樑。將元素/函數處理函數傳遞給gwt函數

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

    }-*/; 

謝謝!

回答

3

您沒有使用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;) 
); 
}-*/; 
2

最簡單的將gwt項目導出到js的方式是使用gwt-exporter。 Gwtexporter允許導出任何gwt項目而無需編寫一行jsni代碼,並且它具有許多功能,可以自定義暴露給js的類和方法,甚至可以爲您的js api生成文檔。

在你的情況下,用你的靜態方法在類中實現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-庫tutorial到JS,雖然該項目的documentation是相當不錯的。

使用這種技術的一些項目是chronoscope,gwtupload(jsupload)gwtquery(jsquery)

+2

太棒了!這個解決方案可以節省很多代碼,特別是在導出數十種方法時。 – 2012-11-30 09:56:53

+1

Yep @ user1711180這就是出口商的目標,您只需在'安全打字'java中編寫代碼並標記您想要公開的內容,就不用擔心jsni內部和語法。認爲出口商也可以處理類型轉換等。 –