Как отформатировать параметр-подпись для метода JSNI с более чем одним параметром? - PullRequest
0 голосов
/ 01 марта 2019

Я использую 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 о том, как это сделать .Я также прочитал, где этот документ указывает мне, как правильно ссылаться на тип JNI .Но я не могу найти пример того, как отформатировать подпись при использовании более 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 голосов
/ 02 марта 2019

Ссылка на класс начинается с 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.

0 голосов
/ 02 марта 2019

В 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);
...