Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用GWT JNSI从Javascript调用Java_Java_Gwt_Jsni - Fatal编程技术网

使用GWT JNSI从Javascript调用Java

使用GWT JNSI从Javascript调用Java,java,gwt,jsni,Java,Gwt,Jsni,如何从Javascript调用Java方法?我尝试了以下方法 但它不起作用。我无法将JS放入Java文件,因为库使用回调。在my App.html文件中: function pickerCallback(data) { var doc = data[google.picker.Response.DOCUMENTS][0]; var name= doc[google.picker.Document.NAME]; var fileId = d

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

但它不起作用。我无法将JS放入Java文件,因为库使用回调。在my 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;
}
加载应用程序时,在浏览器控制台中出现以下错误:

未捕获的语法错误:意外标记非法

在这一行:


在此之前我还尝试了这行代码(现在已注释),它也给出了相同的错误。

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

$entry(@com.onix.sdm.SDM_Mailer::setSelectedFolder(Ljava/lang/String;Ljava/lang/String;)(name, fileId));
JSNI在以下方面得到了很好的解释:

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

这是出于设计——此语法的目的不是公开可由外部JS调用的方法,而是让您从JSNI内部调用。这是因为JSNI可以修改为实际调用java方法

如果您想从纯js中调用Java/GWT方法,那么必须为此公开它们。您链接了,但实际上没有使用重要部分:

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

这是一个重要的部分-您必须将函数公开给外部JS可以调用它的地方,但您必须从JSNI func中公开函数。请注意,我们不是在这里调用函数,只是引用它。

抱歉,这不起作用<代码>$entry(@com.onix.sdm.client.sdm_Mailer::setSelectedFolder(Ljava/lang/String;Ljava/lang/String;)(名称、文件ID))第一次加载时仍然失败,语法错误:意外标记非法。我真的不认为@com是有效的JS语法。谢谢,额外的解释非常有用。文档没有显示实际调用的方法,这就是我认为上面所做的。
public static native void exportStaticMethod() /*-{
   $wnd.computeLoanInterest =
      $entry(@mypackage.MyUtilityClass::computeLoanInterest(IFI));
}-*/;