2013-06-25 16 views
1

我們結合有這樣的方法的Java庫:單聲道Android的結合 - 鐵血陣列

void onDataReceived(java.lang.String fromNode, java.lang.String fromChannel, java.lang.String payloadType, byte[][] payload) 

通知的byte[][] payload參數。

編譯一切正常,但在運行時,當聽者從Java解僱,我們得到如下錯誤:

System.NotSupportedException: Rectangular arrays are not currently supported. 

這是目前單聲道支持Android結合的項目?

我們可以使用其他類型而不是byte[][]來完成工作嗎?

回答

2

Is this currently supported in Mono for Android binding projects?

號想我應該解決這個問題......

你需要的​​參數?如果你不這樣做,你可以編輯生成的代碼[^ 1]來刪除編號爲​​的編組。

如果需要​​參數,您可以編輯生成的代碼並替換此:

byte[][] payload = (byte[][]) JNIEnv.GetArray (native_payload, JniHandleOwnership.DoNotTransfer, typeof (byte[])); 

與此:

byte[][] payload = JNIEnv.GetArray<byte[]> (native_payload); 

(至少,這種變化適合我的瑣碎測試[^ 2]。)

[^ 1]:Ew,編輯生成的代碼。

[^ 2]:平凡測試:

Action<byte[][], byte[][]> equal = (a, b) => { 
     if (!a.SelectMany (_ => _).SequenceEqual (b.SelectMany (_ => _))) 
      throw new InvalidOperationException ("Sequences don't match!\n" + 
        "Expected: " + string.Join (" ", a.SelectMany (_ => _).Select (_ => _.ToString ("x2"))) + 
        " Actual: " + string.Join (" ", b.SelectMany (_ => _).Select (_ => _.ToString ("x2")))); 
}; 
byte[][] data = new byte[][]{ 
    new byte[]{11, 12, 13}, 
    new byte[]{21, 22, 23}, 
    new byte[]{31, 32, 33}, 
}; 
using (var byteArrayArray = new Java.Lang.Object (JNIEnv.NewArray (data), JniHandleOwnership.TransferLocalRef)) { 
    Console.WriteLine ("# jonp [[b: {0}", JNIEnv.GetClassNameFromInstance (byteArrayArray.Handle)); 
    byte[][] data2 = JNIEnv.GetArray<byte[]> (byteArrayArray.Handle); 
    equal (data, data2); 
} 
+0

實際上,我們需要'payload',這是我們感興趣的數據,我沒事做一些醜陋的,只需要獲得訪問該'字節[] []'。我可以通過電子郵件或其他方式向您發送綁定項目。什麼是最好的方式發送給你? (我也輸入了一個Xamarin支持請求) – jonathanpeppers

+0

僅供參考,在我們向Java傳遞'byte [] []'的情況下,當它是一個監聽器而Java傳遞一個'byte [] [ ]到C#。 – jonathanpeppers

+0

簡要調查表明我需要做一個運行時修復。我將嘗試儘快完成4.7.11 alpha版本和未來4.6.10穩定版本的發佈。 – jonp