Как вызвать метод Java из метода JavaScript, который находится в другом методе jsni - PullRequest
0 голосов
/ 12 декабря 2011
 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 ]

1 голос
/ 12 декабря 2011

Ответил в группе 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, является чрезмерно упрощенным в вашем вопросе, но в вашем коде все в порядке)

Вероятно, у вас также будет проблема с this, это может быть не так, как вы думаете. Распространенным шаблоном является присвоение текущего объекта (this, в то время) переменной, на которую вы будете ссылаться из своего замыкания:

var that = this;
…
function OnMouseMove(e) {
   that.@p.A::javaMethod(II)(intVal, intVal);
}
1 голос
/ 12 декабря 2011

Вы делаете две вещи неправильно:

  • Вы не определяете имя класса после @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);
       }
    }-*/;
}
...