为 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绑定库运行时失败访问本机库