首页 > 解决方案 > Xamarin Android java.lang.InstantiationException:java.lang.Class 没有零参数构造函数

问题描述

我正在尝试将 java 库实现到 xamarin 中。为此,我创建了一个 java 绑定库并将 dll 引用到我的 xamarin.android 项目中。基本上 JBL 生成的代码如下所示。如您所见,它没有带有 0 个参数的构造函数。

public abstract class SAAgent : Service
{

        [Register(".ctor", "(Ljava/lang/String;)V", "")]
        protected SAAgent(string p0);
        protected SAAgent(IntPtr javaReference, JniHandleOwnership transfer);
        [Register(".ctor", "(Ljava/lang/String;Ljava/lang/Class;)V", "")]
        protected SAAgent(string p0, Class p1);

我实现了一个继承这个生成的 SAAgent 类的类。

 [Service(Exported = true, Name = "WearCompanion.Droid.ProviderService")]
    public class ProviderService : SAAgent 
    {   

        public ProviderService() : base("ProviderService", SASOCKET_CLASS)
        {

        }

当我执行代码时,我收到一个异常告诉

Java.Lang.RuntimeException Message=无法实例化服务 WearCompanion.Droid.ProviderService:
java.lang.InstantiationException: java.lang.Class 没有零参数构造函数

所以它期望我有 0 参数构造函数。三星 Tizen 网站上有一个示例,他们的 java 示例如下所示

public class ProviderService extends SAAgent {
    private static final String TAG = "HelloAccessory(P)";
    private static final Class<ServiceConnection> SASOCKET_CLASS = ServiceConnection.class;

    public ProviderService() {
        super(TAG, SASOCKET_CLASS);
    }

但是当我查看我的 xamarin.android 项目的 obj 文件夹并找到生成的 ProviderClass.java 文件时。如下所示,

public class ProviderService
    extends com.samsung.android.sdk.accessory.SAAgent
    implements
        mono.android.IGCUserPeer
{


    public ProviderService (java.lang.String p0, java.lang.Class p1)
    {
        super (p0, p1);
        if (getClass () == ProviderService.class)
            mono.android.TypeManager.Activate ("WearCompanion.Droid.ProviderService, WearCompanion.Android", "System.String, mscorlib:Java.Lang.Class, Mono.Android", this, new java.lang.Object[] { p0, p1 });
    }

我不明白如何让 xamarin 从 c# 生成一个带有 0 构造函数的 java 类?那是java绑定问题吗?

PS,我已经反编译了 jar 来查看 SAAgent java 实现,它与 C# 相同。所以java绑定库做了正确的工作。我不确定是否应该自己手动添加无参数构造函数?

标签: javac#xamarinxamarin.android

解决方案


最后我找到了解决方案。Xamarin 实际上在他们的文档中有关于缺少构造函数的信息。正如所解释的,它应该使用一个 Export 属性。因此,如果我如下更改我的 C# 类构造函数。它使用零参数构造函数按预期生成精确的 java 类。

 [Export(SuperArgumentsString = "\"ProviderService\", ProviderService_ProviderServiceSocket.class")]
        public ProviderService() : base("ProviderService", SASOCKET_CLASS)
        {

        }

推荐阅读