3

シナリオ: JavaFX WebView/WebEngine 内で GWT Web アプリケーションを実行しています。問題なく、GWT から JavaScript、JavaFX に文字列を渡すことができます。

問題: Data[] のようなカスタム オブジェクトの配列を同じ方法で渡すと、JavaFX 側の結果が null になります。

データがどのように見えるかの例:

public class Data extends Serializable
{
  char[] name;
  int code;
  short bar;
}

データを JavaScript に送信するコードは次のとおりです。

public static native void doNativeStuff(String id, Data[] data) /*-{
  $wnd.javaInterface.doStuff(id, data);
}-*/;

デバッガーで、渡された Java オブジェクトにデータが取り込まれ、見た目が良いことを確認しました。

JavaFX 側では、javaInterface をページに追加する次のコードがあります。

JSObject win = (JSObject) engine.executeScript("window");
win.setMember("javaInterface", new JavaInterface());

文字列のみを渡す他のメソッドに使用していて、うまく機能するため、これが機能することはわかっています。

public void doStuff(String id, Data[] data)
{
  // Right here, id == "validId" and data == null
  if (data != null)
  {
    ... do what is needed ...
  }
}

Data オブジェクトが定義されており、両側からアクセスできることに注意してください。

GWT のドキュメントから:

Incoming Java type    How it appears to JavaScript code
Java array            opaque value that can only be passed back into Java code

私は JavaScript でまったく触れておらず、Java->JavaScript->Java から渡すだけですが、最後のステップは失敗しているようです。

ここ数時間、Stack Overflow、Google、GWT グループ、gwtproject.org などを精査してきました。しかし、ほとんどすべての例は、1 つの引数が渡されていることを示しているだけで、Java 配列が使用されていることを示している例はほとんどありません。

to->from JSON ではなく、単にオブジェクトを通過させたいのですが、必死になって試してみました。GSON を使用しようとしましたが、GWT クライアント側では機能しません。GWT AutoBean Framework を使用しようとしましたが、Data オブジェクトは有効な Bean ではなく (デフォルトのコンストラクターがないためだと思います)、現時点では変更できません。

Long または long 値は使用していません。

次のような例を見てきました。

@com.google.gwt.examples.JSNIExample::staticFoo(Ljava/lang/String;)(s);

しかし、私が言えることは、JSNI を介して JavaScript から GWT に移行するためだけのものです。私は別の道に行こうとしています。複数の引数の例も見つかりませんでした。

私が見逃している微調整がここにあると確信していますが、まだそれを理解できていません。ここで私が見逃しているものを見つけたら教えてください。

4

2 に答える 2

2

Java コードにのみ戻すことができる不透明な値

これは、Java 配列を JavaScript コードに渡すことができないことを意味すると思います。

jatに同意します。以前は同様のニーズに対応していましたが、オブジェクトを自分でシリアル化する必要がありました。そして、次のように複数の引数を渡すことができます (引数の種類は例として与えられています):

private native void doJSAction(MyClass handler)/*-{
    // do smth in JS

    // then call external non-static method
    handler.@com.myclient.helper.MyClass::doMyAction(Lcom/google/gwt/core/client/JavaScriptObject;Ljava/lang/String;Lcom/myclient/helper/MyClass;II)(jsNativeSmth, myString, handler, intA, intB);
}-*/;

doMyAction次のようなものです。

void doMyAction(JavaScriptObject jsObject, String s, MyClass instance, int a, int b)
于 2013-10-16T00:23:21.810 に答える