我一直在尝试使用 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/