Mono for Android Binding - Jagged数组

时间:2013-06-25 19:07:23

标签: android .net xamarin.android xamarin java-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 for Android绑定项目目前是否支持此功能?

我们可以使用不同类型而不是byte[][]来完成工作吗?

1 个答案:

答案 0 :(得分:2)

  

Mono for 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);
}