我正在使用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;);
};
}-*/;
谢谢!
答案 0 :(得分: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;)
);
}-*/;
答案 1 :(得分: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();
}
这里有tutorial如何将gwt-library导出到js,尽管该项目的documentation非常好。
使用此技术的一些项目包括chronoscope,gwtupload(jsupload)和gwtquery(jsquery)。