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
相关产品推荐
相关产品推荐

