You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin Forms应用启动崩溃:JNI Handle激活失败问题求助

问题原因及修复方案

核心问题分析

  • 类型重名冲突:自定义的GoogleSignInClient类与官方Android.Gms.Auth.Api.SignIn.GoogleSignInClient完全重名,导致C#与Java互操作时类型匹配错误,触发JNI激活失败异常。
  • 过早初始化客户端:在MainActivity构造函数中初始化GoogleSignInClient时,Activity生命周期未启动,上下文this无效,无法正确创建谷歌服务客户端。
  • 错误覆盖系统方法:自定义的StartActivityForResult方法抛出未实现异常,直接阻断谷歌登录的页面跳转逻辑。
  • 不必要的类型包装:自定义的GoogleSignInClientWrapper和隐式转换完全多余,增加了类型转换风险。

修复步骤及代码修正

1. 删除自定义的GoogleSignInClient相关类

直接删除GoogleSignInClient.cs文件,所有操作使用官方提供的Android.Gms.Auth.Api.SignIn.GoogleSignInClient即可。

2. 修正MainActivity中的错误

以下是修复后的完整MainActivity.cs代码:

using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.OS;
using Plugin.FirebasePushNotification;
using Android.Gms.Auth.Api.SignIn;
using Android.Gms.Tasks;
using Android.Widget;
using Xamarin.Forms;

namespace passikaveriApp.Droid
{
    [Activity(Label = "MyApp", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = Android.Content.PM.ConfigChanges.ScreenSize | Android.Content.PM.ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        // 使用官方GoogleSignInClient类型
        private GoogleSignInClient _googleSignInClient;
        const int RC_SIGN_IN = 1;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App());

            FirebasePushNotificationManager.ProcessIntent(this, Intent);

            // 在OnCreate中初始化(上下文已就绪)
            var gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DefaultSignIn)
                .RequestIdToken(Resources.GetString(Resource.String.default_web_client_id))
                .RequestEmail()
                .Build();
            _googleSignInClient = GoogleSignIn.GetClient(this, gso);

            // 添加登录按钮
            var button = new Xamarin.Forms.Button { Text = "用Google账号登录" };
            button.Clicked += OnGoogleSignInButtonClicked;

            var stackLayout = new StackLayout { Children = { button } };
            App.Current.MainPage = new ContentPage { Content = stackLayout };
        }

        // 登录按钮点击事件
        void OnGoogleSignInButtonClicked(object sender, EventArgs e)
        {
            var signInIntent = _googleSignInClient.SignInIntent;
            // 使用系统自带的StartActivityForResult
            StartActivityForResult(signInIntent, RC_SIGN_IN);
        }

        protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
        {
            base.OnActivityResult(requestCode, resultCode, data);

            if (requestCode == RC_SIGN_IN)
            {
                var task = GoogleSignIn.GetSignedInAccountFromIntent(data);
                HandleSignInResult(task);
            }
        }

        // 处理登录结果
        private async void HandleSignInResult(Task<GoogleSignInAccount> task)
        {
            try
            {
                var account = await task;
                Toast.MakeText(this, $"欢迎, {account.DisplayName}!", ToastLength.Short).Show();
                // 后续可添加ID Token验证等逻辑
            }
            catch (ApiException e)
            {
                Toast.MakeText(this, $"登录失败: {e.StatusMessage}", ToastLength.Short).Show();
            }
        }
    }
}

3. 额外注意事项

  • 确认Resource.String.default_web_client_id已正确配置,对应谷歌开发者控制台生成的安卓客户端ID。
  • 检查安卓项目NuGet包版本兼容:确保Xamarin.GooglePlayServices.Auth、Xamarin.Forms等包版本匹配。
  • 验证安卓Manifest文件中已包含谷歌登录所需的权限和配置(通常由NuGet包自动添加,可手动确认)。

内容的提问来源于stack exchange,提问作者Petri T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 12:35:24