为 Xamarin 创建 Android 绑定时出现问题

Posted

技术标签:

【中文标题】为 Xamarin 创建 Android 绑定时出现问题【英文标题】:Issue while creating Android binding for Xamarin 【发布时间】:2020-05-27 19:53:23 【问题描述】:

我正在尝试为我们组织已经创建的库创建绑定项目。我添加了 .aar 文件,当我尝试构建时,出现以下两个错误。

 Error JAVAC0000:  error: OnCompletionListenerImplementor is not abstract and does not override abstract method onCompletion(LockEvent,int,Metadata) in OnCompletionListener

公共类 OnCompletionListenerImplementor (JAVAC0000)

Error JAVAC0000:  error: SingleStepView_OnSelectionListenerImplementor is not abstract and does not override abstract method onSelected(Metadata,LockEvent) in OnSelectionListener
public class SingleStepView_OnSelectionListenerImplementor
 (JAVAC0000)

API.xaml

是这样生成的,

<interface abstract="true" deprecated="not deprecated" final="false" name="OnCompletionListener" static="false" visibility="public" jni-signature="Lno/zedoapp/zebra/key_ui/ui/listener/OnCompletionListener;"></interface>
<interface abstract="true" deprecated="not deprecated" final="false" name="SingleStepView.OnSelectionListener" static="true" visibility="public" jni-signature="Lno/zedoapp/zebra/key_ui/ui/view/SingleStepView$OnSelectionListener;"></interface>

我还注意到在对象浏览器中该类没有正确生成。

public interface IOnCompletionListener : IJavaObject, IDisposable, IJavaPeerable



internal sealed class IOnCompletionListenerImplementor : Java.Lang.Object, IOnCompletionListener, IJavaObject, IDisposable, IJavaPeerable

    public IOnCompletionListenerImplementor ()
        : base (JNIEnv.StartCreateInstance ("mono/Lno/zedoapp/zebra/key_ui/ui/listener/OnCompletionListenerImplementor", "()V"), JniHandleOwnership.TransferLocalRef);

    internal static bool __IsEmpty (IOnCompletionListenerImplementor value);



public interface IOnSelectionListener : IJavaObject, IDisposable, IJavaPeerable



internal sealed class IOnSelectionListenerImplementor : Java.Lang.Object, IOnSelectionListener, IJavaObject, IDisposable, IJavaPeerable

        public IOnSelectionListenerImplementor ()
            : base (JNIEnv.StartCreateInstance ("mono/Lno/zedoapp/zebra/key_ui/ui/view/SingleStepView_OnSelectionListenerImplementor", "()V"), JniHandleOwnership.TransferLocalRef);

        internal static bool __IsEmpty (IOnSelectionListenerImplementor value);

谁能帮我解释问题并解决我的绑定问题

【问题讨论】:

你是否按照这里提到的所有步骤docs.microsoft.com/en-us/xamarin/android/platform/… 是的!!!我也提到了这个链接。 :) 你可以参考[Xamarin.Android Bindings](我也注意到在对象浏览器中这个类没有正确生成。)和Metadata,也许你应该自己自定义元数据 【参考方案1】:

我认为此链接上的文档有些误导。

它告诉您需要为生成的 EventArgs 类赋予不同的名称,因为绑定生成器不能很好地处理泛型并且无法区分 2 个 Java 接口之间的区别。您可以通过将如下转换规则添加到 Medata.xml 文件中来做到这一点:

<attr path="/api/package[@name='com.whatever.android']/interface[@name='InterfaceListenerA']/method[@name='onJavaInterfaceMethodName']"
    name="argsType">InterfaceListenerAEventArgs</attr>

<attr path="/api/package[@name='com.whatever.android']/interface[@name='InterfaceListenerB']/method[@name='onJavaInterfaceMethodName']"
    name="argsType">InterfaceListenerBEventArgs</attr>

在我的情况下,这允许我构建绑定项目。但是当我尝试在 Xamarin Android 项目中引用它并构建它时,我得到了上述错误。

文档没有告诉您的是,当您执行此操作时,生成的事件名称将意味着代码不再在生成的 java 代码中实现所需的接口。为此,您需要将 java 接口方法映射到重命名的 C# 事件属性名称。为此,我添加了如下规则:

<attr path="/api/package[@name='com.whatever.android']/interface[@name='InterfaceListenerA']/method[@name='onJavaInterfaceMethodName']"
    name="managedName">InterfaceListenerA</attr>

<attr path="/api/package[@name='com.whatever.android']/interface[@name='InterfaceListenerB']/method[@name='onJavaInterfaceMethodName']"
    name="managedName">InterfaceListenerB</attr>

注意:托管名称不一定与 Java 接口名称相同 - 它是您为每个没有“EventArgs”后缀的新 EventArgs 类指定的名称。

【讨论】:

以上是关于为 Xamarin 创建 Android 绑定时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms - 创建 Android Wear 应用程序时出现问题

Xamarin.Android Java绑定库运行时失败访问本机库

WorldPayCSE 的 Xamarin IOS 绑定库

Xamarin UWP 似乎绑定到错误的视图模型

加载程序集 Xamarin.Android.Support.v4 时出现异常

为 Xamarin iOS 创建 Aviary SDK 绑定