如何从位于另一个jsni方法中的javascript方法调用java方法


 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);
       }
    }-*/;
}

最新更新