我使用GWT JSNI来访问本机JavaScript库。
我想知道我通过JSNI传递的数据速度是否有任何不同。
示例1:
public static native int test(int value) /*-{
return this.computeSomething(value);
}-*/;
示例2:
public static native double test(double value) /*-{
return this.computeSomething(value);
}-*/;
假设computeSomething()将整数值作为参数并返回整数值。
我是否必须按照此处的建议投出返回值:How to work with int values in gwt jsni methods
在为JSNI函数使用int或double时,它对性能有什么影响吗?
有没有办法从JSNI返回一个int?这里似乎有一个错误:https://code.google.com/p/google-web-toolkit/issues/detail?id=2693
答案 0 :(得分:2)
当您从Java调用JS时,编译器信任JSNI代码完全遵循方法签名。这意味着如果从double
方法返回int
值,您可能会在其他位置获得其他效果。这产生以下结果:
就性能而言,它完全没有区别。由于GWT假设JS会按照你说的那样做,它不会做任何额外的工作来验证(除了在开发模式下,作为验证代码有意义的方法)
有几种方法可以从JS Number转换为可能是浮点数的整数,这样您就可以确定GWT / Java代码可以接受它。第一种是简单地返回double
,然后在您的Java代码中,转换为int
,或使用Math.round
删除任何不需要的精度。另一个是在你的JSNI中做com.google.gwt.dom.client.Element#toInt32
与GWT 2.6相同的事情:
/**
* Fast helper method to convert small doubles to 32-bit int.
*
* <p>Note: you should be aware that this uses JavaScript rounding and thus
* does NOT provide the same semantics as <code>int b = (int) someDouble;</code>.
* In particular, if x is outside the range [-2^31,2^31), then toInt32(x) would return a value
* equivalent to x modulo 2^32, whereas (int) x would evaluate to either MIN_INT or MAX_INT.
*/
private static native int toInt32(double val) /*-{
return val | 0;
}-*/;
请注意在您的链接答案中使用| 0
与|| 0
- 第一个是按位OR,而第二个是布尔值。
从JSNI返回int
没有问题 - 链接的问题是关于返回java.lang.Integer
,int
周围的盒装Java类型。这个问题存在缺陷,因为JsArray<Integer>
已经存在com.google.gwt.core.client.JsArrayNumber
,因此不需要{{1}},你只需要转换为int来处理舍入问题。