#java #json #gwt #java-native-interface
#java #json #gwt #java-native-interface
Вопрос:
У меня возникла проблема с преобразованием JSON в тип наложения JNI. Код Java должен использовать следующий метод:
long nr = 10l;
public Long getNr() {
return nr;
}
Тип наложения JNI является:
public final native Long getNr() /*-{
return this.nr;
}-*/;
Я избегаю работы с примитивом long в типе наложения, поскольку компилятор этого не допускает. В официальной документации говорится, что это неэффективно, но это должно сработать. Тем не менее, я получаю:
java.lang.IllegalArgumentException: Something other than a Java object was returned from JSNI method '@com.avaya.thunder.portal.client.shared.model.Customer::getNr1()': JS value of type int, expected java.lang.Object
at com.google.gwt.dev.shell.JsValueGlue.get(JsValueGlue.java:178)
at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:271)
Я использую GWT 2.2.0.
Это что-то, что я делаю неправильно? Должно ли это работать? Приветствуется любая помощь. Спасибо.
Ответ №1:
Вам нужно вставить объект Long, если вы хотите его извлечь:
public native void setNr(Long val) /*-{
this.nr = val;
}-*/;
К сожалению, это означает, что ‘nr’ будет непрозрачным объектом в JavaScript. Обычно мы обходим примитивы ‘double’, если хотим манипулировать числом как в JS, так и в Java. Таким образом, нет никаких сюрпризов (примитив Java double напрямую сопоставляется с номером типа Js).
Комментарии:
1. Теперь я понимаю, что компилятор GWT может эмулировать только long в коде Java, и как только мы опускаем уровень JSNI, компилятор не затрагивает этот код. Спасибо.