2

如何从 Javascript 调用 Java 方法?我尝试了以下

http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html#calling

但它不起作用。我无法将 JS 放入 Java 文件,因为该库使用回调。在我的 App.html 文件中:

    function pickerCallback(data) {
        var doc = data[google.picker.Response.DOCUMENTS][0];
        var name= doc[google.picker.Document.NAME];
        var fileId = data.docs[0].id;

        // set the path text field
        //[instance-expr.]@class-name::field-name
        //[instance-expr.]@class-name::method-name(param-signature)(arguments)
        // Call static method 
        //@com.onix.sdm.client.SDM_Mailer::setSelectedFolder(Ljava/lang/String;Ljava/lang/String;)(name, fileId);
        $entry(@com.onix.sdm.client.SDM_Mailer::setSelectedFolder(name, fileId));
    }

在 SDM_Mailer.java 中:

private static void setSelectedFolder(String folder, String id) {
    SDM_Mailer myThis = SDM_Mailer.getInstance();
    myThis.textFolder.setText(folder);
    myThis.folderId = id;
}

当我加载应用程序时,在浏览器控制台中出现此错误:

Uncaught SyntaxError: Unexpected token ILLEGAL

在这条线上:

      $entry(@com.onix.sdm.client.SDM_Mailer::setSelectedFolder(name, fileId));

我还尝试了在那之前的那一行(暂时评论),这也给出了同样的错误。

4

2 回答 2

3

我无法将 JS 放入 Java 文件,因为该库使用回调

这是设计使然 - 此语法的目的不是公开可以由外部 JS 调用的方法,而是让您从 JSNI 中调用它。这是因为可以修改 JSNI 以实际调用 java 方法。

如果您想从纯 js 中调用 Java/GWT 方法,则必须为此公开它们。您链接了http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html#calling,但实际上并没有使用重要部分:

public static native void exportStaticMethod() /*-{
   $wnd.computeLoanInterest =
      $entry(@mypackage.MyUtilityClass::computeLoanInterest(IFI));
}-*/;

这是重要的部分 - 您必须将函数暴露给外部 JS 可以调用它的地方,但您必须从 JSNI 函数中进行暴露。注意我们这里不是调用函数,只是引用它。

于 2013-10-04T22:49:05.843 回答
0

我认为您错过了类型参数:

$entry(@com.onix.sdm.SDM_Mailer::setSelectedFolder(Ljava/lang/String;Ljava/lang/String;)(name, fileId));

JSNI 在 DevGuideCodingBasicsJSNI 中有很好的解释

于 2013-10-04T22:30:25.470 回答