使用GWT JNSI从Javascript调用Java

时间:2013-10-04 21:25:55

标签: java gwt jsni

如何从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;
}

当我加载应用时,in会在浏览器控制台中显示此错误:

  

未捕获的SyntaxError:意外的标记ILLEGAL

在这一行:

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

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

2 个答案:

答案 0 :(得分: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函数中进行公开。请注意,我们不是在此处调用函数,只是引用它。

答案 1 :(得分:0)

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

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

JSNI在DevGuideCodingBasicsJSNI

得到了很好的解释