如何为具有 1 个以上参数的 JSNI 方法格式化参数签名?

How to format param-signature for a JSNI method with more than 1 parameter?

我正在使用 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);
        });
    }-*/;
}

对于我来说,当参数超过 1 个时,我无法弄清楚如何正确设置参数签名的格式。

我已阅读 GWT documentation regarding how to do this. I've also read where that document directs me to how to properly refer to the JNI Type。但是我似乎找不到使用超过 1 个参数时如何格式化签名的示例。看起来应该很容易。

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

我尝试过的每一种不同的排列都导致了同样的错误。

"Referencing method 'com.path.to.myClass.myMethod(Ljava/lang/String;Z)/' unable to resolve method."

在 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);

一个 class 引用以 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