我有一个方法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 [] []数组作为输入

我希望像

这样的东西

处理程序@ com.mypackage :: myMethod的([[Ljava /郎/字符串)。(myArray的);

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

单维数组即。 [Ljava/lang/String;很好,但我需要第二个维度。

任何帮助/想法或指向优秀jnsi文档的链接表示赞赏。

有帮助吗?

解决方案

你能发布你得到的错误,以及你试图传递给hashmap的那种javascript对象。我假设你得到一个编译时错误?

这是JSNI文档的一个良好开端:

GWT博文关于JSNI

其他提示

我认为你正在遇到类型擦除。每个通用对象参数实际上只是运行时的java.lang.Object。我不认为仿制药会暴露给JNI。

我编写了JNI代码,但从未尝试过使用本机代码中的泛型类型,所以我不确定。谷歌搜索没有找到具体的参考或例子。

请参阅 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']);

好的,看了之后......

我无法找到任何给出多维数组字符串的文档或排列。 管理使用HashMap完成此操作,使用:

handler.@com.mypackage::myMethod(Ljava/util/Hashmap;)(myHashMap);
如果在没有定义类型的情况下定义输入,

就可以工作。如:

HashMap myHashMap = new HashMap();

这为JSNI提供了类型为<Object, Object>的HashMap。

然后我通过将hashmap的内容转换为字符串来处理另一方的对象。

感谢链接生锈:

GWT博文在JSNI上 -

之前没见过这个博客
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top