2012-11-29 171 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内部和语法。认为出口商也可以处理类型转换等。 –