gpt4 book ai didi

java - Xamarin Android java.lang.InstantiationException : java. lang.Class 没有零参数构造函数

转载 作者:行者123 更新时间:2023-12-02 01:49:50 24 4
gpt4 key购买 nike

我正在尝试将 java 库实现到 xamarin.java 中。为此,我创建了一个 java 绑定(bind)库并将 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=Unable to instantiate service WearCompanion.Droid.ProviderService:
java.lang.InstantiationException: java.lang.Class has no zero argument constructor

所以它期望我有 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绑定(bind)的问题吗?

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

最佳答案

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

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

}

关于java - Xamarin Android java.lang.InstantiationException : java. lang.Class 没有零参数构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57433943/

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