c# - 错误: Could not activate JNI Handle - WorkManager implementation in Xamarin

标签 c# xamarin android-workmanager

我一直在尝试使用 Xamarin 在 .NET 中实现 WorkManager ( https://developer.android.com/topic/libraries/architecture/workmanager/ )(移植我们使用 jobscheduler 的旧代码)。启动应用程序时,我收到“错误:无法激活 MyWorker1 类型的 JNI 句柄”,并且似乎无法弄清楚为什么我的实现被破坏。

我的基本实现:


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 搞乱了 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 (我不确定是否需要第二行,但它不会对我们的使用造成伤害)

编辑:这仅部分解决了问题。即使使用固定的 proguard 文件,我们仍然会间歇性地遇到这个问题。

关于c# - 错误: Could not activate JNI Handle - WorkManager implementation in Xamarin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76631740/

相关文章:

android - Job Scheduler 和 WorkManager 在应用被终止时被销毁

c# - Xamarin 在 ListView 中不使用 DataTemplateSelector

c# - 查找哪个函数使用某个属性

c# - MVVM 运行时 Onload 绑定(bind)错误

c# - Task.WaitAll超时时如何获取未完成的任务?

ios - MvvmCross 6.0 - TipCalc iOS 示例 - 无法正常工作

ios - ZXing Xamarin Forms iOS 白底(无Custom Renderer)

android - 更新到 WorkManager 1.0.0-alpha09 后编译错误

android - WorkManager - 永久移除周期性 worker

c# - 比较数据库中的密码以进行密码更新