我正在开发一个关于在Android上嵌入web应用程序的项目,遵循WebView演示,但是当Android应用程序调用javascript函数'wave'时我需要调用gwt函数:
<html>
<script language="javascript">
/* This function is invoked by the activity */
function wave(s) {
// call a gwt function and
// pass 's' to the gwt function
}
</script>
<body>
<!-- Calls into the javascript interface for the activity -->
<a onClick="window.demo.clickOnAndroid()"><div style="width:80px;
...
</div></a>
</body>
</html>
关于如何实现这一目标的任何想法?
答案 0 :(得分:5)
您需要将要从javascript调用的任何方法导出到javascript全局范围。这意味着你不能从手写的javascript中调用任意java方法。您必须提前计划并在javascript范围中公开必要的方法。
这个过程非常简单:
来自GWT JSNI documentation的示例以及其他评论:
package mypackage;
public MyUtilityClass
{
//Method to be called from javascript, could be in any other class too
public static int computeLoanInterest(int amt, float interestRate,
int term) { ... }
//This method should be called during application startup
public static native void exportStaticMethod() /*-{
//the function named here will become available in javascript scope
$wnd.computeLoanInterest =
$entry(@mypackage.MyUtilityClass::computeLoanInterest(IFI));
}-*/;
}
修改强>
将参数传递给Java方法:
当你从javascript调用带有参数的Java方法时,你需要使用特定的语法:
[instance-expr.]@class-name::method-name(param-signature)(arguments)
例如,调用带有String参数的静态方法将如下所示:
@com.google.gwt.examples.JSNIExample::staticFoo(Ljava/lang/String;)(s);
请注意,我们正在调用静态方法'instance-expr。'省略。其余代码是完全限定的类名,后跟::
和方法名称。方法名称后的Ljava/lang/String;
指定我们需要调用将String对象作为参数的方法。最后s
是该参数的实际值。
请记住,在我们的示例中,param-signature,Ljava/lang/String;
在语法中使用JNI type signature specs,并且即使存在多个具有相同名称的重载方法,GWT编译器也需要选择正确的方法。即使方法没有超载,也需要param-signature
。
答案 1 :(得分:1)
GWT被编译为javascript并且所有函数/对象名称都被缩小,因此它们变得不可读且未知,因此您无法直接从Javascript调用它们。要解决此问题,您需要查看Call a Java Method from Handwritten JavaScript的方法。
答案 2 :(得分:0)
使用Javascript叠加类型!
看这里:
不能更好地描述它!