public class A{
private void javaMethod(int a,int b){}
private native void init()/*-{
function OnMouseMove(e) {
//blow calling doesn't work
this.@p::javaMethod(Ljava/...teger;Ljava.../Integer;)(intVal,intVal);
}
}-*/;
}
如上所述,如何使调用工作?
Google群答:https://groups.google.com/d/msg/google-web-toolkit/qE2-L4u_t4s/YqjOu-bUfsAJ
为了参考和方便,复制在这里:
首先,int
不是java.lang.Integer
,所以你在JSNI中的方法签名是错误的;应该是javaMethod(II)
。(我想@p::
而javaMethod在A类中定义在您的问题中过度简化,但在您的代码中是OK的)
你也可能有this
的问题,这可能不是你想的那样。一种常见的模式是将当前对象(当时是this
)赋值给将从闭包中引用的变量:
var that = this;
…
function OnMouseMove(e) {
that.@p.A::javaMethod(II)(intVal, intVal);
}
你做错了两件事:
-
您没有在
@p
之后定义类名(假设@p
实际上只是实际包名的缩短版本); -
您试图通过
java.lang.Integer
代替int
。您应该将(II)
作为类型,如下所示。
你的代码应该看起来像这样:
package com.my.package;
public class ClassA {
private static void javaMethod(int a, int b) { ... }
public static native void init() /*-{
$wnd.javaMethod = function(a, b) {
return @com.my.package.ClassA::javaMethod(II)(a,b);
}
function OnMouseMove(e) {
$wnd.javaMethod(a,b);
}
}-*/;
}