Тип массива Java Hashmap и многомерного массива подписывается в JSNI?

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

[email protected]::myMethod(Ljava/util/Hashmap;)(myHashMap);
[email protected]::myMethod(Ljava/util/Hashmap<Ljava/lang/String,Ljava/lang/String>;)(myHashMap);

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

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

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

[email protected]::myMethod([[Ljava/lang/String;)(myArray);

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

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

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


person sre    schedule 22.11.2008    source источник


Ответы (3)


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

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

документ GWT JSNI

Запись в блоге GWT на JSNI< /а>

person rustyshelf    schedule 25.11.2008

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

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

См. Подписи типов виртуальных машин 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']);
person Mark Renouf    schedule 01.12.2008

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

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

[email protected]::myMethod(Ljava/util/Hashmap;)(myHashMap);

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

HashMap myHashMap = new HashMap();

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

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

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

GWT JSNI doc – это полезно для получения правильного форматирования примитивов.

Запись в блоге GWT на JSNI - раньше не видел этот блог

person sre    schedule 25.11.2008