从JSNI调用Java方法

时间:2017-03-27 14:14:04

标签: javascript gwt jsni

我有一个班级,例如:

public class Person {

    private String name;

    public Person(String name) {
        this.name = name;
    }

    public void sayName() {
        System.out.println(name);
    }
}

如果我调用这样的方法(或者我的无知或错误),它会起作用吗?

public native void someMethod (Person person) /*-{
    person.sayName();
}-*/;

2 个答案:

答案 0 :(得分:5)

来自Accessing Java Methods and Fields from JavaScript文档:

语法为:

i;T
0;1
1;2
2;3
3;4
4;3
  
      
  • instance-expr。:调用实例方法时必须存在,调用静态方法时必须不存在

  •   
  • class-name :是声明方法的类的完全限定名称(或其子类)

  •   
  • param-signature :是JNI Type Signatures中指定的内部Java方法签名,但没有尾随签名   方法返回类型,因为不需要选择重载

  •   
  • 参数:是传递给被调用方法的实际参数列表

  •   

以下是JNI类型签名:

[instance-expr.]@class-name::method-name(param-signature)(arguments)

在你的情况下(没有参数),它将是:

Type Signature               Java Type
Z                            boolean
B                            byte
C                            char
S                            short
I                            int
J                            long
F                            float
D                            double
L fully-qualified-class ;    fully-qualified-class
[ type                       type[]
( arg-types ) ret-type       method type

For example, the Java method:

long f (int n, String s, int[] arr); 
has the following type signature:

(ILjava/lang/String;[I)J

public native void someMethod (Person person) /*-{ person.@your.package.name.client.Person::sayName()(); }-*/; 替换为真实的包名。

答案 1 :(得分:1)

package org.example.foo;
public class Flipper {

  public native void flipName(String name) /*-{
    var re = /(\w+)\s(\w+)/;
    var s = name.replace(re, '$2, $1');
    this.@org.example.foo.Flipper::onFlip(Ljava/lang/String;)(s);
  }-*/;

  private void onFlip(String flippedName) {
   // do something useful with the flipped name
  }
}