从Javascript JSNI调用Java

0 java gwt jsni smartgwt

我正在使用SmartGWT,我希望com.smartgwt.client.Version从JavaScript 访问.在Firefox的Web控制台中,我尝试过:

frames[0].$entry(Lcom_smartgwt_client_Version::getVersion()));

frames[0].$entry(@com.smartgwt.client.Version.getVersion());

frames[0].$entry(@com.smartgwt.client.Version::getVersion());

frames[0].$entry(@com.smartgwt.client.Version::getVersion()());

但所有这些都返回语法错误.

我的WAR部署了SmartGWT,我可以看到其他的SmartGWT类frames[0].

调用此静态Java方法的正确语法是什么?

Col*_*rth 6

除了java文件中的JSNI代码之外,这些JSNI引用不起作用.JSNI中对Java方法和字段的引用实际上并不是有效的JavaScript,而是JSNI语言的一部分,它使这些本机方法都能使用Java和JavaScript.JSNI字符串@com.smartgwt.client.Version::getVersion()()将被重写为类似于$getVersion1()PRETTY的东西,或者在OBF模式下只有一两个字符的长度,因此您不能依赖该方法名称相同.

相反,您需要从应用程序内部导出JavaScript函数,以便此外部JavaScript可以调用它.有关详细信息,请访问https://developers.google.com/web-toolkit/doc/latest/DevGuideCodingBasicsJSNI#calling.

以下是您的应用程序中的外观示例:

public native void exportGetVersion() /*-{
  $wnd.getSmartGwtVersion = $entry(function() {
    return @com.smartgwt.client.Version::getVersion()();
  });
}-*/;
Run Code Online (Sandbox Code Playgroud)

确保你在你的应用程序中调用此函数来导出函数 - 在调用之后的任何时候,你可以getSmartGwtVersion()从常规JavaScript 调用- 不需要使用frames$entry.