2

我有一个方法 JSNI,它调用一个以 Hasmap 作为输入的 Java 方法。我试过了

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[][] 数组作为输入的替代方法

我希望有类似的东西

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

但是,我遇到了另一个问题,即为数组的第二维找到正确的 JNSI sntax

一维数组,即。[Ljava/lang/String;很好,但我需要二维。

任何帮助/想法或链接到好的 jnsi 文档表示赞赏。

4

3 回答 3

1

I think you're running into type erasure. Every generic object parameter is really just java.lang.Object at runtime. I don't believe generics are exposed to JNI.

I've written JNI code but never attempted to use generic types from native code so I'm not certain. Googling has turned up no specific references or examples.

See Java VM Type Signatures for a reference to the type signatures used in JNI (and JSNI)

However, you may not need to pass a Java HashMap to Javascript anyway. Instead, consider using JSONObject and passing a native JavaScript object to your javascript code. It looks like this:

  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']);
  }-*/;

This gets compiled to roughly:

var obj = {'propertyName': 'propertyValue'};
$wnd.alert(obj['propertyName']);
于 2008-12-01T20:49:56.940 回答
0

你能发布你得到的错误,以及你试图作为哈希图传递的 javascript 对象类型。我假设您遇到编译时错误?

这是 JSNI 文档的良好开端:

GWT JSNI 文档

GWT 关于 JSNI 的博客文章

于 2008-11-25T12:47:30.817 回答
0

好的,看完之后...

我找不到任何提供多维字符串数组的文档或安排。设法使用 HashMap 完成此操作,使用:

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

如果我在不定义类型的情况下定义输入,则可以工作。如:

HashMap myHashMap = new HashMap();

这为 JSNI 提供了一个 HashMap 类型<Object, Object>

然后我通过将哈希图的内容转换为字符串来处理另一端的对象。

感谢生锈的链接:

GWT JSNI doc - 这有利于获得正确的原语格式

GWT Blog post on JSNI - Hadn't seen this blog before

于 2008-11-25T21:15:47.467 回答