0

如何在 jsni 方法中使用 int 值?

public class Person extends JavaScriptObject{                                                                                                                     

   // some other methods

   public final native void setPoints(int i)/*-{
       this.points= this.points + i;
   }-*/;

   public final native int getPoints()/*-{
        return this.points;
   }-*/;                                                                                    
}

我在结合 JsArray 的方法中使用它

public static boolean moreThanZeroPoints(JsArray<Person> arr, int index){
     if(arr.get(index).getPoints() > 0){
         return true;
     }
     return false;
}

Inarr.get(index).getPoints()给出以下错误消息:

    uncaught: Exception caught: Exception: caught: something other than an int was returned from JSNI method.
    package-path:: getPoints(): JS value of type undefined, expected int

因为arr.get(index).setPoints(1)我得到了同样的错误信息。怎么了?请帮忙。

4

2 回答 2

1

因为points可能不存在,所以您必须强制undefined转换为 ; 中的某个整数值getPoints()。要么添加一个hasPoints()方法,要么只在定义 getPoints()时调用。points

// coerce undefined (or null, or 0) to 0
public final native int getPoints() /*-{
  return this.points || 0;
}-*/;

或者

// coerce undefined or null to -1
public final native int getPoints() /*-{
  return (this.points != null) ? this.points : -1;
}-*/;

对于setPoints(),你声明了一个返回类型,int但实际上从未return编辑过任何东西,这相当于undefined在 JS 中返回。qben 编辑了您的答案并通过将返回类型更改为void.

于 2013-02-17T11:40:59.853 回答
0

请注意,代码没有引用JavaScript window object directly inside the method. 访问浏览器的window and document objects from JSNI时,您必须分别将它们引用为$wnd and $doc。您编译的脚本在嵌套框架中运行,并且 $wnd 和 $doc 会自动初始化以正确引用host page's window and document.

public final native int setPoints(int i)/-{ 
    $wnd.points=  $wnd.points + i;
 }-/;

并且应该如下所示:

public final native int getPoints()/*-{
    return  eval('$wnd.' + points);;

}-*/;
于 2013-02-15T09:52:04.423 回答