我一直在try 使用Xamarin在.NET中实现WorkManager(https://developer.android.com/topic/libraries/architecture/workmanager/)(将旧代码移植到我们使用JobScheduler的地方).在启动应用程序时,我收到"错误:无法激活类型为MyWorker1的JNI句柄",并且似乎找不到为什么我的实现被 destruct 了.

我的基本实现:


using Android.App;
using Android.Content;
using AndroidX.Work;
using System;
using MyTooling.Services;
using MyTooling.ViewModels.Base;

namespace MyTooling.Droid.Workers
{
    public abstract class BackgroundWorkerBase : Worker
    {
        protected MyService1 MyService;

        protected WorkerParameters WorkerParameters { get; }

        protected BackgroundWorkerBase(Context context, WorkerParameters workerParameters) : base(context, workerParameters)
        {
            if (!Xamarin.Forms.Forms.IsInitialized)
                Xamarin.Forms.Forms.Init(Application.Context, null);
            if (!ViewModelLocator.IsRegistered)
                ViewModelLocator.RegisterDependencies(Helpers.Settings.UseMocks);
            MyService = ViewModelLocator.Resolve<MyService1>();
            WorkerParameters = workerParameters;
               
        }
        public override Result DoWork()
        {
            try
            {
                var success = TryBackgroundWork();
                if (!success || AnyWorkLeft())
                    return Result.InvokeRetry();
                else
                    return Result.InvokeSuccess();
            }
            catch (Exception ex)
            {
                Log.LogError(ex);
                return Result.InvokeFailure();
            }
        }

        protected abstract bool AnyWorkLeft();
        protected abstract bool TryBackgroundWork();
    }
}

JNI错误所指的类:

using Android.Content;
using AndroidX.Work;

namespace MyTooling.Droid.Workers
{
    public class MyWorker1: BackgroundWorkerBase
    {
        public MyWorker1(Context context, WorkerParameters workerParameters) : base(context, workerParameters)
        {
        }

        protected override bool AnyWorkLeft()
        {
            return MyService.AnyWork1Left();
        }

        protected override bool TryBackgroundWork()
        {
            return MyService.TryDoWork1();
        }

    }
}

推荐答案

我想出了答案.ProGuard/r8 destruct 了JNI链接,因此添加了一个仅包含以下行的自定义ProGuard配置文件(https://learn.microsoft.com/en-us/xamarin/android/deploy-test/release-prep/proguard?tabs=windows#customizing-proguard):

-keep class androidx.** {*;}
-keep class android.arch.** {*;}

解决了我的问题!原来我们指望缺省配置来做我们需要的事情,而且它还没有更新以处理androidx(我不确定是否需要第二行,但它对我们的使用没有影响)

Csharp相关问答推荐

无法使用ternal- .net修复可空警告

无法从具有一对多关系的C#类中使用Swagger创建记录

将修剪声明放入LINQ中

编写DataAnnotations自定义验证器的多种方法

NumPy s fftn in C#with pythonnet'

实现List T,为什么LINQ之后它不会返回MyList?<>(无法强制转换WhereListIterator `1类型的对象)'

如何将Kafka消息时间戳转换为C#中的日期和时间格式?

Quartz调度程序不调用作业(job)类

如何将ASP.NET Core 2.1(在.NET框架上运行)更新到较新的版本?

由于POST中的应用程序/JWT,出现不支持的内容类型异常

如何在ASP.NET Core8中启用REST应用程序的序列化?

如何比较C#中的L和ł(波兰字符)返回TRUE

HttpRequestMessage.SetPolicyExecutionContext不会将上下文传递给策略

BFF到具有AAD/Entra ID B2C的内部API(.NET/ASP.NET核心/标识.Web)

为值对象编写自定义JsonConverter

正在从最小API-InvocationConext.Arguments中检索参数的FromBodyAttribute

如何在JSON:API中定义的&过滤查询参数系列&标准的GET请求中传递多个相关参数?

为什么INTEGER在通过反射调用时对空对象返回TRUE,而在INTEGER上调用时返回FALSE?

使用生产环境调试我的应用程序的快速方法

MS Project读取项目自定义域