Mono для Android Binding - Зубчатый массив

Мы связываем библиотеку Java, у которой есть такой метод:

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[][] чтобы сделать работу?

1 ответ

Решение

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

Думаю, я должен это исправить...

Вам нужен 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]: тривиальный тест:

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);
}
Другие вопросы по тегам