如何为具有 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 个参数时如何格式化签名的示例。看起来应该很容易。
那么,如何正确格式化我的参数签名?我试过:
- 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;);
我尝试过的每一种不同的排列都导致了同样的错误。
"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
。
我正在使用 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 个参数时如何格式化签名的示例。看起来应该很容易。
那么,如何正确格式化我的参数签名?我试过:
- 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;);
我尝试过的每一种不同的排列都导致了同样的错误。
"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
。