Java Hashmap и многомерный массив sig в ​​JSNI?

У меня есть метод 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 для второго измерения массива.

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

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

3 ответа

Решение

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

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

GWT JSNI doc

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

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

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

Посмотрите Подписи Типа Java 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>,

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

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

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

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

Другие вопросы по тегам