gpt4 book ai didi

xamarin - 为 Xamarin 创建 Android 绑定(bind)时出现问题

转载 作者:行者123 更新时间:2023-12-03 15:51:30 24 4
gpt4 key购买 nike

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

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

公共(public)类 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);
}

有人可以帮我解释问题并解决我的绑定(bind)问题吗

最佳答案

在我看来,此链接上的文档有些误导。
它告诉您需要为生成的 EventArgs 类赋予不同的名称,因为绑定(bind)生成器不能很好地处理泛型并且无法区分 2 个 Java 接口(interface)之间的区别。您可以通过将如下转换规则添加到 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>
就我而言,这允许我构建绑定(bind)项目。但是当我尝试在 Xamarin Android 项目中引用它并构建它时,我得到了上述错误。
文档没有告诉您的是,当您这样做时,生成的事件名称将意味着代码不再在生成的 java 代码中实现所需的接口(interface)。为此,您需要将 java 接口(interface)方法映射到重命名的 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 接口(interface)名称相同 - 它是您为每个新 EventArgs 类指定的任何名称,不带“EventArgs”后缀。

关于xamarin - 为 Xamarin 创建 Android 绑定(bind)时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60185254/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com