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

ではarr.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実際には何も編集していません。これは、JS でのreturn戻りと同等です。undefinedqben が回答を編集し、戻り値の型を に変更して修正しました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 に答える