使用JSNI将JavaScript集成到GWT中的问题

时间:2011-06-28 17:39:37

标签: gwt websocket jsni

我正在尝试使用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 个答案:

答案 0 :(得分:1)

在使用JavaScriptObject时,我从GWT获得了相同的错误报告。

我的问题只是所有 JSO方法必须声明最终,而我错过了一个。

答案 1 :(得分:1)

您缺少$ wnd前缀

return new $wnd.WebSocket(url);

答案 2 :(得分:0)

只是一个猜测,但据我所见,叠加用于JSON类型数据。在这里,您尝试执行浏览器API对象的编组。我不确定它是否会以这种方式工作。特别是JSNI对传递的类型有限制。

也许您可以尝试将WebSocket存储为本机部分中的字段,并将方法委托给该字段。但这只是一个盲目的猜测。

答案 3 :(得分:0)