2

Hasmap を入力として受け取る Java メソッドを呼び出すメソッド JSNI があります。私はもう試した

handler.@com.mypackage::myMethod(Ljava/util/Hashmap;)(myHashMap);
handler.@com.mypackage::myMethod(Ljava/util/Hashmap<Ljava/lang/String,Ljava/lang/String>;)(myHashMap);

文字列を含めるための正しい型シグネチャを定義したり、この使用法が許可されているかどうかを確認したりすることができないようです。

私はgwtでこれを行っているので、ハッシュマップの実装である可能性がありますが、入力としてString [] []配列を取ります

私は何かを望んでいました

handler.@com.mypackage::myMethod([[Ljava/lang/String;)(myArray);

ただし、配列の 2 次元の正しい JNSI 構文を見つけるという別の問題にぶつかりました。

一次元配列、すなわち。[Ljava/lang/String;大丈夫ですが、2次元が必要です。

ヘルプ/アイデア、または優れた jnsi ドキュメントへのリンクを歓迎します。

4

3 に答える 3

1

型消去が発生していると思います。すべての汎用オブジェクト パラメータは、実行時には実際には単なる java.lang.Object です。ジェネリックが JNI に公開されているとは思えません。

私は JNI コードを作成しましたが、ネイティブ コードからジェネリック型を使用しようとしたことがないため、確信が持てません。グーグルは、特定の参照や例を見つけていません。

JNI (および JSNI) で使用される型シグネチャのリファレンスについては、Java VM Type Signaturesを参照してください。

ただし、Java HashMap を Javascript に渡す必要はないかもしれません。代わりに、JSONObject を使用し、ネイティブ JavaScript オブジェクトを JavaScript コードに渡すことを検討してください。次のようになります。

  public void callFoo() {
    JSONObject obj = new JSONObject();
    obj.put("propertyName", new JSONString("properyValue"));
    JavaScriptObject jsObj = obj.getJavaScriptObject();

    nativeFoo(jsObj);
  }

  public native void nativeFoo(JavaScriptObject obj) /*-{
    $wnd.alert(obj['propertyName']);
  }-*/;

これは大まかに次のようにコンパイルされます。

var obj = {'propertyName': 'propertyValue'};
$wnd.alert(obj['propertyName']);
于 2008-12-01T20:49:56.940 に答える
0

よし、見終わったら…

文字列の多次元配列を提供するドキュメントや配置を見つけることができませんでした。以下を使用して、HashMap を使用してこれを行うことができました。

handler.@com.mypackage::myMethod(Ljava/util/Hashmap;)(myHashMap);

タイプを定義せずに入力を定義するとうまくいきました。そのような:

HashMap myHashMap = new HashMap();

これにより、JSNI に type の HashMap が与えられ<Object, Object>ます。

次に、ハッシュマップの内容を文字列にキャストすることで、反対側のオブジェクトを処理します。

リンクのrustyに感謝します:

GWT JSNI doc - プリミティブの正しいフォーマットを取得するのに適しています

JSNI に関する GWT ブログ投稿- このブログは初めて見ました

于 2008-11-25T21:15:47.467 に答える
0

取得したエラーと、ハッシュマップとして渡そうとする JavaScript オブジェクトの種類を投稿できますか。コンパイル時エラーが発生していると思いますか?

以下は、JSNI ドキュメントの良い出発点です。

GWT JSNI ドキュメント

JSNI に関する GWT ブログ投稿

于 2008-11-25T12:47:30.817 に答える