如何从 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));
我也尝试了之前的那一行(现在已注释),它也给出了相同的错误。
最佳答案
I can't put the JS into Java file because the library uses a callback
这是设计使然 - 此语法的目的不是公开可以由外部 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 函数内部进行此暴露。请注意,我们在这里没有调用该函数,只是引用它。
关于java - 使用 GWT JNSI 从 Javascript 调用 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19191062/