GWT 中的 JSNI 在调用时生成 java.lang.UnsatisfiedLinkError

JSNI in GWT makes java.lang.UnsatisfiedLinkError when called

正在尝试为遗留 GWT 项目内置 JSNI 支持。我添加了从按钮的 onclick 处理程序调用的简单 JSNI 警报函数 -

public static native void JSAlert(String msg)
/*-{
$wnd.alert(msg);
}-*/;

public class JSNITestCommandHandler extends AbstractEventListener<JSNITestCommand> {

  @Override
  public void execute(JSNITestCommand event) {
    JSAlert("TEST JS ALERT");
  }
}

当我在浏览器中点击按钮时,显示"Executing..."大约10秒,然后出现错误信息-

------------ 出了点问题------------ com.gotapi.hcsapplication.client.XLcmApplicationClient.JSAlert(Ljava/lang/String;)V

java.lang.UnsatisfiedLinkError: com.gotapi.hcsapplication.client.XLcmApplicationClient.JSAlert(Ljava/lang/String;)V

如何解决这个问题?

此错误表明您正在尝试从普通 JVM 中 运行 GWT-only 代码(即不是遗留 "dev mode",或者通过在浏览器中实际执行代码)。具体而言,JVM 中的 JSNI 或 JsInterop native 调用不能 运行。

GWT是为了让你在浏览器中编译Java到运行,而不是让你在JVM中运行JS。旧的 JSNI 代码或新的 JsInterop 是您如何编写 Java 来描述浏览器内将发生的事情,超出 Java 可以理解的范围。它不能在普通 JVM 中 运行。

对于 运行 单元测试,使用 GWTTestCase 作为测试的超类,并使用 gradle/maven GWT 插件调用测试。这将使 GWT 将您的 Java 编译成 JS,然后 运行 在您配置的任何浏览器中全部(包括 JSNI)。