为了账号安全,请及时绑定邮箱和手机立即绑定

Xamarin Android java.lang.InstantiationException:

Xamarin Android java.lang.InstantiationException:

C#
胡子哥哥 2023-08-20 10:56:17
我正在尝试将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 个参数构造函数。Samsung 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 从带有 0 个构造函数的 C# 生成 java 类?这是java绑定的问题吗?PS,我已经反编译了jar来查看SAAgent java实现,它与C#实现相同。所以java绑定库做了正确的工作。我不确定是否应该自己手动添加无参数构造函数?
查看完整描述

1 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

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


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

        }


查看完整回答
反对 回复 2023-08-20
  • 1 回答
  • 0 关注
  • 117 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信