Catel 4.5.4与Xamarin.Android - 错误 - System.NotSupportedException:无法激活JNI句柄

时间:2017-10-25 10:07:24

标签: xamarin.android catel

我正在尝试使用Catel 4.5.4创建一个示例Xamarin.Android C#应用程序。 它由Activity,View Model类和Application类组成。 (最后的代码)

当我运行它时,我收到以下错误:

  

10-23 13:41:04.890 I / MonoDroid(8769):System.NotSupportedException:无法激活Java类型'md5b251e24e9fff919bf177c55c6e30cd8e / MainActivity'的JNI句柄0x6ec00025(key_handle 0x41ed37d8)作为托管类型'Test.Views.MainActivity' 。 ---> System.NotSupportedException:为了支持Android中的导航事件,Catel使用自定义ActivityLifecycleCallbacksListener。这需要一个app实例。请确保Android应用包含应用类。

完整调试日志 https://pastebin.com/UZHhVHfL

该错误似乎来自Catel源代码中的这一行:

https://github.com/Catel/Catel/blob/hotfix/4.5.4/src/Catel.MVVM/Catel.MVVM.Shared/MVVM/Navigation/NavigationAdapter.phone.android.cs#L210

    var activity = GetNavigationTarget<Activity>();
        var application = activity.Application;
        if (application == null)
        {
            const string error = "To support navigation events in Android, Catel uses a custom ActivityLifecycleCallbacksListener. This requires an app instance though. Please make sure that the Android app contains an Application class.";
            Log.Error(error);

            -->throw new NotSupportedException(error);

这里activity.Application为null。我该如何解决这个问题?

我已尝试使用以下Catel版本的代码:

4.1.0 - 代码工作

4.2.0 - 代码工作

4.5.0 - 代码工作

4.5.1 - 错误

4.5.4 - 错误

我必须使用4.5.4,因为在修复此问题后,我想将现有的WPF + Catel(4.5.4)Windows应用程序移植到Android。

以下是代码的相关部分:

查看/ MainActivity.cs

using Android.App;
using Android.OS;
using Android.Util;
namespace Test.Views
{
    [Activity(Label = "Test", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Catel.Android.App.Activity
    {

        protected override void OnCreate(Bundle bundle)
        {
            Log.Debug("MainActivity", "Activity onCreate Called");
            base.OnCreate(bundle);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);
        }
    }
}

MyApp.cs

我因为错误而创建了这个类,但它没有解决问题。我应该在构造函数中添加任何内容吗?或覆盖任何其他功能?

using System;
using Android.App;
using Android.Runtime;
using Android.Util;


namespace Test
{
    [Application(Debuggable = true, Label = "Test App")]
    class MyApp : Catel.Android.App.Application
    {

        public MyApp(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
        {

        }


        public override void OnCreate()
        {
            base.OnCreate();
            Log.Error("MyApp", "Application onCreate Called");
        }
    }
}

1 个答案:

答案 0 :(得分:0)

  1. 我们建议使用catel 5.x,4.x将不会收到任何新功能和/或修补程序。您甚至可以使用Xamarin.Forms(我们通过.NET Standard 2.0在5.3中添加了支持)。

  2. 确保在活动之前实际实例化应用程序类。然后它应该工作。