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

时间:2011-12-12 02:21:08

标签: gwt jsni

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

如上所述,如何进行调用工作?

2 个答案:

答案 0 :(得分:1)

你做错了两件事:

  • 您没有在@p之后定义类名,(假设@p实际上只是真实包名称的缩短版本);

  • 您试图通过java.lang.Integer代替int。您应该将(II)称为类型,如here所述。

您的代码应该更像这样:

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

答案 1 :(得分:1)

谷歌集团回答:https://groups.google.com/d/msg/google-web-toolkit/qE2-L4u_t4s/YqjOu-bUfsAJ

在此复制以供参考和使用:

首先,int不是java.lang.Integer,因此您在JSNI中的方法签名是错误的;它应该是javaMethod(II)。 (我认为@p::而在A类中定义了javaMethod在你的问题中是过度简化,但在你的代码中是正常的)

您可能也会遇到this的问题,这可能不是您认为的问题。一种常见的模式是将当前对象(当前this)分配给您将从闭包中引用的变量:

var that = this;
…
function OnMouseMove(e) {
   that.@p.A::javaMethod(II)(intVal, intVal);
}