1

JSNI を使用して GWT 用の WebSockets の単純なバインディングを作成しようとしていますが、JSNI メソッドが呼び出されるたびに例外が発生し続けます。簡略化されたクラス定義は次のとおりです。

public class Socket extends JavaScriptObject{
    protected Socket() {}

    public static native Socket connect(String url) /*-{
        return new WebSocket(url);
    }-*/;
}

行を使用して Socket オブジェクトをインスタンス化しようとしている間:

Socket socket = Socket.connect("http://www.google.com");

次の例外が発生し、理由がわかりません:

   java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.google.gwt.dev.shell.ModuleSpace.onLoad(ModuleSpace.java:396)
    at com.google.gwt.dev.shell.OophmSessionHandler.loadModule(OophmSessionHandler.java:193)
    at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:510)
    at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:352)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.ClassFormatError: Illegal method name "$" in class edu/catalindumitru/gwt/socket/Socket
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:465)
    at com.google.gwt.dev.shell.CompilingClassLoader.findClass(CompilingClassLoader.java:1078)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at edu.catalindumitru.gwt.steel.client.GameCore.onModuleLoad(GameCore.java:32)
    ... 9 more

以前、型付き配列と Web ワーカーに対して同様のバインディングを作成しようとしましたが、まったく同じエラーが発生したため、これらのバインディングの開発を中断し、この例外の理由が見つかるまで、より簡単なことを試すことにしました。

4

4 に答える 4

1

JavaScriptObjectをかなり慣習的に使用しているときに、GWTから同じエラーレポートを受け取りました。

私の問題は、すべてのJSOメソッドをfinalとして宣言する必要があるということでしたが、1つを見逃していました。

于 2011-10-12T15:16:37.643 に答える
1

$wnd プレフィックスがありません

return new $wnd.WebSocket(url);
于 2012-01-19T20:55:10.387 に答える
0

推測ですが、私が見た限りでは、オーバーレイはJSONタイプのデータではなく使用されていました。ここでは、ブラウザAPIオブジェクトのマーシャリングを実行してみます。このように機能するかどうかはわかりません。特に、JSNIには渡されるタイプの制限があります。

たぶん、WebSocketをフィールドとしてネイティブ部分に格納して、そのフィールドにメソッドを委任することができます。しかし、これは単なる推測です。

于 2011-06-28T20:34:54.367 に答える
0

他の人がどのように実装したかを見てみましょう: http://code.google.com/p/gwt-comet/source/browse/trunk/src/net/zschech/gwt/websockets/client/WebSocket.java

たぶん、 gwt-comet の websocketsを使用できますか?

于 2011-06-29T06:35:40.353 に答える