【问题标题】:Porting a Java SDK to Xamarin.Android, binding Library error regarding types将 Java SDK 移植到 Xamarin.Android,绑定有关类型的库错误
【发布时间】:2016-07-08 05:14:00
【问题描述】:

我正在将 Java SDK 移植到 Xamarin.Android。

在解决了无数错误之后,我陷入了这个:

/Users/alejandro_l/Projects/KontaktBeaconSDK/KontaktBeaconSDK/obj/Debug/generated/src/Com.Kontakt.Sdk.Android.Ble.Configuration.Scan.EddystoneScanContext.cs(65,65):错误 CS1715:@987654323 @System.Collections.Generic.ICollection' 匹配被覆盖的成员 `Com.Kontakt.Sdk.Android.Ble.Configuration.Scan.AbstractProfileSpecificScanContext.EventTypes' (CS1715) (KontaktBeaconSDK)

为了解决错误,我认为应该可以在 metadata.xml 中使用以下行告诉生成器更改方法的类型以匹配抽象类:

<attr path="/api/package[@name='com.kontakt.sdk.android.ble.configuration.scan']/class[@name='EddystoneScanContext']/method[@name='getEventTypes' and count(parameter)=0]" name="managedType">System.Collections.Generic.ICollection</attr>

基于:https://developer.xamarin.com/guides/android/advanced_topics/binding-a-java-library/customizing-bindings/java-bindings-metadata/#managedType

生成的输出仍然有错误的形状:

        static IntPtr id_getEventTypes;
    public override unsafe global::System.Collections.ICollection EventTypes {
        // Metadata.xml XPath method reference: path="/api/package[@name='com.kontakt.sdk.android.ble.configuration.scan']/class[@name='EddystoneScanContext']/method[@name='getEventTypes' and count(parameter)=0]"
        [Register ("getEventTypes", "()Ljava/util/Collection;", "GetGetEventTypesHandler")]
        get {
            if (id_getEventTypes == IntPtr.Zero)
                id_getEventTypes = JNIEnv.GetMethodID (class_ref, "getEventTypes", "()Ljava/util/Collection;");
            try {
                return global::Android.Runtime.JavaCollection.FromJniHandle (JNIEnv.CallObjectMethod  (Handle, id_getEventTypes), JniHandleOwnership.TransferLocalRef);
            } finally {
            }
        }
    }

如您所见,生成的是 System.Collections.ICollection,而不是 System.Collections.Generic.ICollection。 注意:我什至还没有弄清楚如何设置泛型类型,但这是下一步。

我是装订新手,我无法弄清楚。有人可以告诉我我做错了什么吗?我在这里尝试一个不可能的事情吗?我需要更改 SDK 的源代码吗? (请注意,如果我使用“构建”并手动更改输出,我将来可能会得到 dll(但仍然存在 49 个错误),但我想知道我是否可以以正确的方式解决)。

我使用的另一个有用的链接:https://gist.github.com/brendanzagaeski/9607158

【问题讨论】:

    标签: android generics binding xamarin.android


    【解决方案1】:

    找到了:

    <attr path="/api/package[@name='com.kontakt.sdk.android.ble.configuration.scan']/class[@name='EddystoneScanContext']/method[@name='getEventTypes' and count(parameter)=0]" name="return">System.Collections.Generic.ICollection&lt;Com.Kontakt.Sdk.Android.Ble.Discovery.EventType&gt;</attr>

    由于name="return",错误似乎已消失。我不知道为什么 return 没有出现在文档中,但它出现在 api.xml 中,所以应该没问题。

    【讨论】:

    • 警告:来自文档“managedReturn”=“更改方法的返回类型。这不会更改返回属性(因为更改返回属性可能导致对 JNI 签名的不兼容更改)”。这就是为什么要避免它。我会检查是否有进一步的错误。
    • 你是我的英雄。经过 5 小时的搜索,这只是给出了很好的方向的答案,几乎回答了我的问题。我需要安装通用 IList 属性 IList。我的解决方案 System. Collections.IList<Org.Webrtc.AudioTrack>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多