Проблема GWT с типами наложения Long в Javascript JNI

#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, компилятор не затрагивает этот код. Спасибо.