Вопрос

У меня есть метод JSNI, который вызывает метод Java, который принимает Hasmap в качестве входных данных.я пробовал

handler.@com.mypackage::myMethod(Ljava/util/Hashmap;)(myHashMap);
handler.@com.mypackage::myMethod(Ljava/util/Hashmap<Ljava/lang/String,Ljava/lang/String>;)(myHashMap);

Кажется, я не могу определить правильную сигнатуру типа для включения строк или узнать, разрешено ли это использование.

Поскольку я делаю это в gwt, я думаю, что это может быть реализация хеш-карты, и альтернативный подход, который я использовал, принимает массив String[][] в качестве входных данных.

Я надеялся на что-то вроде

handler.@com.mypackage::myMethod([[Ljava/lang/String;)(myArray);

Однако я столкнулся с еще одной проблемой поиска правильного снтаксиса JNSI для второго измерения массива.

Одномерный массив, т.е. [Ljava/lang/String; это нормально, но мне нужно 2-е измерение.

Любая помощь/идеи или ссылки на хороший документ jnsi приветствуются.

Это было полезно?

Решение

Можете ли вы опубликовать полученную ошибку, а также какой объект javascript вы пытаетесь передать в качестве хэш-карты.Я предполагаю, что вы получаете ошибку времени компиляции?

Вот хорошее начало документации JSNI:

Документ GWT JSNI

Сообщение в блоге GWT о JSNI

Другие советы

Я думаю, вы столкнулись со стиранием типа.Каждый параметр универсального объекта на самом деле представляет собой просто java.lang.Object во время выполнения.Я не верю, что дженерики доступны для JNI.

Я написал код JNI, но никогда не пытался использовать универсальные типы из собственного кода, поэтому не уверен.Гугление не дало конкретных ссылок или примеров.

Видеть Сигнатуры типов виртуальных машин Java для ссылки на сигнатуры типов, используемые в JNI (и JSNI)

Однако вам в любом случае может не потребоваться передавать Java HashMap в Javascript.Вместо этого рассмотрите возможность использования JSONObject и передачи собственного объекта JavaScript в ваш код JavaScript.Это выглядит так:

  public void callFoo() {
    JSONObject obj = new JSONObject();
    obj.put("propertyName", new JSONString("properyValue"));
    JavaScriptObject jsObj = obj.getJavaScriptObject();

    nativeFoo(jsObj);
  }

  public native void nativeFoo(JavaScriptObject obj) /*-{
    $wnd.alert(obj['propertyName']);
  }-*/;

Это компилируется примерно так:

var obj = {'propertyName': 'propertyValue'};
$wnd.alert(obj['propertyName']);

Хорошо, после просмотра...

Мне не удалось найти какую-либо документацию или механизм, дающий многомерный массив строк.Удалось сделать это с помощью HashMap, используя:

handler.@com.mypackage::myMethod(Ljava/util/Hashmap;)(myHashMap);

сработало, если я определяю ввод без определения типов.Такой как:

HashMap myHashMap = new HashMap();

Это дает JSNI HashMap типа <Object, Object>.

Затем я обрабатываю объект на другой стороне, преобразуя содержимое хэш-карты в строки.

Спасибо Rusty за ссылки:

Документ GWT JSNI - Это хорошо для получения правильного форматирования примитивов

Сообщение в блоге GWT о JSNI - не видел этот блог раньше

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top