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

09-11 18:30