2008-11-22 24 views
2

我有一個方法JSNI調用一個Hasmap作爲輸入的Java方法。 我試過JSNI中的Java HashMap和Mutlidimensional數組類型sig?

[email protected]::myMethod(Ljava/util/Hashmap;)(myHashMap); 
[email protected]::myMethod(Ljava/util/Hashmap<Ljava/lang/String,Ljava/lang/String>;)(myHashMap); 

我似乎無法確定正確的類型簽名包括字符串或找到,如果這種用法甚至允許的。

由於我在GWT我這樣做,雖然它可能是HashMap中的實現和替代方法我已經雖然以一個String [] []數組作爲輸入

我希望的somwthing像

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

不過,我打找到正確的JNSI sntax爲陣

一個一維數組即第2維的另一個問題。 [Ljava/lang/String;很好,但我需要第二個維度。

任何幫助/想法或良好的jnsi文檔的鏈接表示讚賞。

回答

0

你可以發佈你得到的錯誤,以及你想要傳遞的哈希表是什麼樣的JavaScript對象。我假設你得到一個編譯時錯誤?

這裏是JSNI文檔一個良好的開端:

GWT JSNI doc

GWT Blog post on JSNI

+0

的JSNI文檔鏈接不工作了:-( – 2012-07-04 17:46:06

0

好吧,看它以後...

我無法找到任何文件或安排給出了字符串的多維數組。 管理使用HashMap的,使用完成這件事:

[email protected]::myMethod(Ljava/util/Hashmap;)(myHashMap); 

工作,如果我定義輸入而不定義的類型。如:

HashMap myHashMap = new HashMap(); 

這給出了JSNI類型爲<Object, Object>的HashMap。

然後,我通過將散列表的內容轉換爲字符串來處理對象。

由於生鏽的鏈接:

GWT JSNI doc - 這有利於獲得元

GWT Blog post on JSNI的正確格式 - 還沒有看到這個博客之前

1

我想你」重新進入類型擦除。每個通用對象參數在運行時實際上只是java.lang.Object。我不相信泛型會暴露給JNI。

我已經寫了JNI代碼,但從來沒有試圖從本機代碼使用泛型類型,所以我不確定。谷歌搜索沒有具體的參考或例子。

用於在JNI(和JSNI)所使用的類型簽名參考見Java VM Type Signatures

然而,你可能不需要通過一個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']);