如何为带有多个参数的JSNI方法设置参数签名格式?

时间:2019-03-01 20:07:20

标签: gwt jsni

我正在使用GWT,并且具有带有签名的Java方法,该签名需要一个字符串和一个布尔参数,例如:

private void myMethod(String s, Boolean b) {}

我有一个JSNI方法,可以在编译后公开此Java方法:

public class myClass {
    public native void exportMyMethod(myClass c)/*-{
        $wnd.myMethod = $entry(function(s, b) {
            c.@com.path.to.myClass::myMethod(Ljava/lang/String;Z);
        });
    }-*/;
}

在我的一生中,当有多个参数时,我无法弄清楚如何正确格式化参数签名。

我已经读过GWT documentation regarding how to do this。我还阅读了该文档directs me to how to properly refer to the JNI Type的位置。但是我似乎找不到使用多于1个参数时如何格式化签名的示例。看起来应该很容易。

那么,如何正确格式化我的参数签名?我尝试过:

  • c。@ com.path.to.myClass :: myMethod(Ljava / lang / String; Z);
  • c。@ com.path.to.myClass :: myMethod(Ljava / lang / String; Ljava / lang / Boolean;);
  • c。@ com.path.to.myClass :: myMethod(Ljava / lang / StringLjava / lang / Boolean;);
  • c。@ com.path.to.myClass :: myMethod(Ljava / lang / String;,Ljava / lang / Boolean;);

我尝试过的每个不同排列都导致了相同的错误。

“引用方法'com.path.to.myClass.myMethod(Ljava / lang / String; Z)/'无法解析方法。”

2 个答案:

答案 0 :(得分:5)

在Javascript中,与Java不同,您实际上可以像对待变量一样传递方法-您可以将其重新分配,将其分配给变量等。这意味着要使JSNI引用起作用,我们需要一种方法不仅要调用它们,还要引用它们。

然后,标准JSNI模式为instance.@path.to.Class::method(arg;types;)(actual, params)

在您的情况下,此行

c.@com.path.to.myClass::myMethod(Ljava/lang/String;Z);

应更改为类似的内容

c.@com.path.to.myClass::myMethod(Ljava/lang/String;Z)(s, b);

但是请注意,Z是指boolean,而不是Boolean,因此您问题中的当前代码不一致。如果只有一个使用特定名称的方法,则可以省略类型,而只需传递*

c.@com.path.to.myClass::myMethod(*)(s, b);

答案 1 :(得分:2)

类引用以L开始,以;结尾,并且参数类型没有分隔。因此只有前两个签名格式正确:

  • c.@com.path.to.myClass::myMethod(Ljava/lang/String;Z);
  • c.@com.path.to.myClass::myMethod(Ljava/lang/String;Ljava/lang/Boolean;);

第一个为boolean,第二个为java.lang.Boolean