[英]GWT JSNI - how to call external javascript from java code using jsni
[英]How to cast a return value from javascript to java in GWT JSNI?
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);
我在这里发布了由于GWT版本(2.4)约束而最终成功的结果
从GWT Doc:
外发Java类型:
任何其他Java对象(包括数组)
必须通过什么:
必须源自Java代码的正确类型的Java对象; Java对象无法从JavaScript中“稀薄地”构造
我的修改后的代码想要:
public static native MyObject nativeJSFuncGwt(MyObject obj) /*-{
var xyz = $wnd.someJsFunc();
obj.@package.name::setter1(Ljava/lang/String;)(xyz);
return obj;
}-*/;
我希望文档可以更加清晰。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.