【发布时间】: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