2013-06-25 2 views
1

Мы связывание библиотеки Java, который имеет метод, как это:Mono для Android Binding - Jagged массив

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. 

ли это в настоящее время поддерживается в Mono для Android привязки проектов?

Есть ли другой тип, который мы могли бы использовать вместо byte[][], чтобы выполнить эту работу?

ответ

2

Is this currently supported in Mono for Android binding projects?

No. Guess я должен исправить ...

ли вам нужен параметр payload? Если вы этого не сделаете, вы можете просто отредактировать сгенерированный код [^ 1], чтобы удалить маршалинг payload.

Если вы сделать нужен параметр payload, вы можете редактировать сгенерированный код и заменить это:

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

с этим:

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

(По крайней мере, это изменение работает для моего тривиальный тест [^ 2].)

[^ 1]: Ew, редактирование сгенерированного кода.

[^ 2]: Trivial тест:.

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

FYI, кажется, прекрасно работает в тех случаях, когда мы передаем 'byte [] []' на Java, а не когда это слушатель, а Java передает байты [] [ ] 'на C#. – jonathanpeppers

+0

Краткое исследование показывает, что мне нужно выполнить исправление во время выполнения. Я постараюсь сделать это как можно скорее для версии 4.7.11 alpha и будущей версии 4.6.10 с стабильной версией. – jonp

Смежные вопросы