Java Hashmap и многомерный массив sig в ​​JSNI? - PullRequest
2 голосов
/ 23 ноября 2008

У меня есть метод 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, я подумал, что это может быть реализация hashmap и альтернативный подход, хотя я принимаю массив String [] [] в качестве ввода

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

Обработчик @ com.mypackage :: MyMethod ([[Ljava / языки / String;). (ТуАггау);

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

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

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

Ответы [ 3 ]

1 голос
/ 01 декабря 2008

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

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

См. Сигнатуры типов Java VM для ссылки на сигнатуры типов, используемые в 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']);
0 голосов
/ 26 ноября 2008

Хорошо, посмотрев на это ...

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

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

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

HashMap myHashMap = new HashMap();

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

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

Спасибо Ржавому за ссылки:

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

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

0 голосов
/ 25 ноября 2008

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

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

GWT JSNI doc

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

...