【问题标题】:Catel 4.5.4 with Xamarin.Android - Error - System.NotSupportedException: Could not activate JNI Handle带有 Xamarin.Android 的 Catel 4.5.4 - 错误 - System.NotSupportedException:无法激活 JNI 句柄
【发布时间】:2017-10-25 19:58:05
【问题描述】:

我正在尝试创建一个使用 Catel 4.5.4 的示例 Xamarin.Android C# 应用程序。 它由一个活动、视图模型类和一个应用程序类组成。 (代码在最后)

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

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

完整的调试日志: 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 为空。我该如何解决这个问题?


我已尝试使用以下 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。


以下是代码的相关部分:

Views/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");
        }
    }
}

【问题讨论】:

    标签: xamarin.android catel


    【解决方案1】:
    1. 我们建议使用 catel 5.x,4.x 将不会收到任何新功能和/或修补程序。您甚至可以选择 Xamarin.Forms(我们正在通过 .NET Standard 2.0 在 5.3 中添加对它的支持)。

    2. 确保在活动之前实际实例化应用程序类。那么它应该可以工作了。

    【讨论】:

    • 我假设已经有一个应用程序类实例,因为调试日志中正在打印“Application onCreate Called”日志消息。我应该手动创建另一个实例吗?如果是这样,在哪里以及如何(Catel Application 类构造函数的两个参数是什么)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多