【问题标题】:Android Bindings Library creates an abstract class for an interfaceAndroid 绑定库为接口创建一个抽象类
【发布时间】:2020-11-13 15:15:08
【问题描述】:

我正在尝试为 AAR 库创建 Android 绑定库。

这里是IMessages

package my.package.messages;

public interface IMessages {
    public static final String SOME_STRING_1 = "somevalue1";
    public static final String SOME_STRING_2 = "somevalue2";

    void method1(Context paramContext);
    void method2(Context paramContext);
}

生成的代码如下所示:

// Metadata.xml XPath interface reference: 
path="/api/package[@name='my.package.messages']/interface[@name='IMessages']"
[Register ("my/package/messages/IMessages", "", "My.Package.Messages.IMessagesInvoker")]
public partial interface IMessages : IJavaObject, IJavaPeerable {

    // Metadata.xml XPath method reference: path="/api/package[@name='my.package.messages']/interface[@name='IMessages']/method[@name='method1' and count(parameter)=1 and parameter[1][@type='android.content.Context']]"
    [Register ("method1", "(Landroid/content/Context;)V", "GetMethod1_Landroid_content_Context_Handler:My.Package.Messages.IMessagesInvoker, TestBindingLibrary")]
    void Method1(global::Android.Content.Context p0);

    // Metadata.xml XPath method reference: path="/api/package[@name='my.package.messages']/interface[@name='IMessages']/method[@name='method2' and count(parameter)=1 and parameter[1][@type='android.content.Context']]"
    [Register ("method2", "(Landroid/content/Context;)V", "GetMethod2_Landroid_content_Context_Handler:My.Package.Messages.IMessagesInvoker, TestBindingLibrary")]
    void Method2(global::Android.Content.Context p0);
}

[Register ("my/package/messages/IMessages", DoNotGenerateAcw=true)]
public abstract class Messages : Java.Lang.Object {

    internal Messages ()
    {
    }

    // NOTES: I assume this class is generated because interfaces can't have const fields in C# unlike Java
    // But this class is clashing with a "real" class named Messages

    // Metadata.xml XPath field reference: path="/api/package[@name='my.package.messages']/interface[@name='IMessages']/field[@name='SOME_STRING_1']"
    [Register ("SOME_STRING_1")]
    public const string SomeString1 = (string) "somevalue1";

    // Metadata.xml XPath field reference: path="/api/package[@name='my.package.messages']/interface[@name='IMessages']/field[@name='SOME_STRING_2']"
    [Register ("SOME_STRING_2")]
    public const string SomeString2 = (string) "somevalue2";
}

现在的问题是 AAR 库包含一个 Message 类,它的生成方式如下:

// Metadata.xml XPath class reference: path="/api/package[@name='my.package.messages']/class[@name='Messages']"
[global::Android.Runtime.Register ("my/package/messages/Messages", DoNotGenerateAcw=true)]
public partial class Messages : global::Java.Lang.Object, global::My.Package.Messages.IMessages {

    // Metadata.xml XPath constructor reference: path="/api/package[@name='my.package.messages']/class[@name='Messages']/constructor[@name='Messages' and count(parameter)=0]"
    [Register (".ctor", "()V", "")]
    public unsafe Messages ()
        : base (IntPtr.Zero, JniHandleOwnership.DoNotTransfer)
    {
        // Omitted for brevity
    }
}

同时拥有抽象的 Messages 类和从 IMessages 接口继承的“真实”类,我收到以下错误:

类型“消息”已经定义了一个名为“.ctor”的成员,具有相同的参数类型

我的问题是,我怎样才能改变抽象类的生成,使其不会与“真正的”Messages 类发生冲突?我看了Metadata.xml Transform File,但我不清楚应该做什么。

【问题讨论】:

    标签: c# xamarin interface abstract-class bindings-library


    【解决方案1】:

    尝试查看“Adding Types”章节。 您应该在 Metadata.xml 中添加一个示例:

    <add-node path="/api/package[@name='my.package.messages']">
      <class abstract="false" deprecated="not deprecated" final="false" 
             name="Messages" static="false" visibility="public" extends="java.lang.Object"</class>
    </add-node>
    

    【讨论】:

    • 不应该添加一个名为Messages的类吗?我不想添加它,它已经自动生成并与另一个名为相同的现有类发生冲突。
    • 只注意abstract="false" 字段。您也可以使用
    猜你喜欢
    • 2023-03-08
    • 2017-11-04
    • 1970-01-01
    • 2014-06-15
    • 2011-05-18
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    相关资源
    最近更新 更多