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:
Я думаю, что вы сталкиваетесь с стиранием типов. Каждый параметр универсального объекта действительно просто 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 - раньше не видел этот блог