JSNI方法不接受任何参数,但返回Java Object类型:
public static native String nativeJSFuncGwt() /*-{
$wnd.console.log($wnd.someJSFunc());
return "" + $wnd.someJSFunc() + "" ;
}-*/;
//someJSFunc returns { abc:xcv, def:asd}
我可以看到该值已在javascript控制台中打印出来,但Java方面无法理解转换。
是否因为本机方法不接受任何参数?
String tokenFromNativeJS = nativeJSFuncGwt(); // String value is null
GWT中的文档也不够清楚。
最佳答案
第一步,避免使用JSNI,最好定义一个提供相同API访问权限的JsInterop方法。 JSNI仍然可以在GWT2中使用,但是JsInterop是GWT3的前进之路,并且通常更容易读写。看起来像这样:
@JsMethod(name = "someJSFunc", namespace = JsPackage.GLOBAL)
public static native String someJSFunc();
第二步,定义一个适合您期望的JS返回值的Java类型。这将与JSNI或JsInterop一起使用。在JSNI中,您将创建一个JavaScriptObject子类,并提供访问字段的方法(有关更多详细信息,请参见http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html和其他文档,但是按照第一步,在这里,我不会对此进行更深入的介绍)。对于您的示例对象,在JsInterop中看起来像这样:
@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL)
public class SomeReturnObject {
public String abc;
public double def;
}
显然,用您自己项目中合适的名称替换字段名称和类型。给此新类型加上占位符名称,这就是您的全局someJsFunc的外观:
@JsMethod(name = "someJSFunc", namespace = JsPackage.GLOBAL)
public static native SomeReturnObject someJSFunc();
您将像使用纯Java一样使用它-不再需要编写JSNI了:
SomeReturnObject object = someJSFunc();
DomGlobal.console.log(object.abc + ": " + object.def);