使用GWT JNSI从Javascript调用Java
如何从Javascript调用Java方法?我尝试了以下方法 但它不起作用。我无法将JS放入Java文件,因为库使用回调。在my App.html文件中:使用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
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));
}-*/;