GWT无法从"用户模块"中找到*本地方法*在编译时

时间:2014-04-26 16:38:58

标签: java gwt timer native

我正在尝试将我的GWT代码与Guice / GIN集成(因为它需要客户端,JVM(共享代码)和运行测试时的不同配置)。我现在得到一个奇怪的错误,在编译时没有找到方法:

[INFO] com.google.gwt.dev.jjs.InternalCompilerException: Unexpected error during visit.
...
[INFO] Caused by: java.lang.UnsatisfiedLinkError: com.google.gwt.user.client.Timer.createCallback(Lcom/google/gwt/user/client/Timer;I)Lcom/google/gwt/core/client/JavaScriptObject;
[INFO]  at com.google.gwt.user.client.Timer.createCallback(Native Method)
[INFO]  at com.google.gwt.user.client.Timer.scheduleRepeating(Timer.java:121)
[INFO]  at ...

com.google.gwt.user.client.Timer驻留在User模块中,Timer.scheduleRepeating()是用Java编写的,并委托给Timer.createCallback(),这是一个" native&#34 ; (JavaScript)方法。所以编译器找到Timer本身和Timer.scheduleRepeating(),但不是本机方法。

是什么导致这个?在尝试使用GIN之前,我没有遇到此问题。

编辑:由于其他人似乎看到了不同的代码,以下是在查看com.google.gwt.user.client.Timer时所看到的内容:

...
  private static native JavaScriptObject createCallback(Timer timer, int cancelCounter) /*-{
    return $entry(function() { timer.@com.google.gwt.user.client.Timer::fire(I)(cancelCounter); });
  }-*/;
...
  public void scheduleRepeating(int periodMillis) {
    if (periodMillis <= 0) {
      throw new IllegalArgumentException("must be positive");
    }
    if (isRunning()) {
      cancel();
    }
    isRepeating = true;
    timerId = Impl.setInterval(createCallback(this, cancelCounter), periodMillis);
  }
...

2 个答案:

答案 0 :(得分:1)

您在项目中添加了新的依赖项。

请清理项目并重新编译。

  • 删除gwt-unitCache和其他自动生成的存根,如下面的屏幕截图
  • 所示

enter image description here

答案 1 :(得分:1)

好的,我把它解决了。在GIN模块中,我正在注入一些创建GWT Timer所需的代码。问题是,GIN 在编译时执行模块。当然,在编译时,GWT Timer“本机代码”不可用,因为这发生在JVM本身。

所以我只是尝试捕获UnsatisfiedLinkError并忽略它。但是这个也不会直接解决,因为在GWT中没有UnsatisfiedLinkError,所以我只是抓住了“Error”,并检查了类名。然后这一切都奏效了。但是,在我发现令人沮丧之前,我无法覆盖GIN模块上的“provideXXX()”方法(为什么?)。此外,即使允许GIN模块是抽象的,GIN仍然需要公共的无参数构造函数(GIN将永远不会调用,因为抽象类不能实例化!)。