Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Mono.Android]
JNIEnv.FindClass()
uses `JniEnvironment.Types.FindCl…
…ass()` (#9769) Context: xamarin/monodroid@ed984a3 Context: dotnet/java-interop#23 Update `JNIEnv.FindClass()` to use `JniEnvironment.Types.FindClass()`. This avoids the problem of `JNIEnvInit.mid_Class_forName` being `null` in a NativeAOT context: E AndroidRuntime: Process: net.dot.hellonativeaot, PID: 30744 E AndroidRuntime: net.dot.jni.internal.JavaProxyThrowable: System.TypeInitializationException: TypeInitialization_Type_NoTypeAvailable E AndroidRuntime: ---> System.ArgumentNullException: ArgumentNull_Generic Arg_ParamName_Name, method E AndroidRuntime: at Java.Interop.JniEnvironment.StaticMethods.CallStaticObjectMethod(JniObjectReference, JniMethodInfo, JniArgumentValue*) + 0x1c8 E AndroidRuntime: at Android.Runtime.JNIEnv.FindClass(String) + 0xb4 E AndroidRuntime: at Java.Lang.Class..cctor() + 0x7c E AndroidRuntime: at System.Runtime.CompilerServices.ClassConstructorRunner.EnsureClassConstructorRun(StaticClassConstructionContext*) + 0xb4 E AndroidRuntime: Exception_EndOfInnerExceptionStack E AndroidRuntime: at System.Runtime.CompilerServices.ClassConstructorRunner.EnsureClassConstructorRun(StaticClassConstructionContext*) + 0x160 E AndroidRuntime: at System.Runtime.CompilerServices.ClassConstructorRunner.CheckStaticClassConstructionReturnNonGCStaticBase(StaticClassConstructionContext*, IntPtr) + 0x14 E AndroidRuntime: at Android.Runtime.JNIEnv.FindClass(String) + 0xc0 E AndroidRuntime: at Android.App.Application.get_Context() + 0x50 E AndroidRuntime: at Microsoft.Maui.Hosting.EssentialsExtensions.<>c.<UseEssentials>b__0_0(ILifecycleBuilder life) + 0x18 E AndroidRuntime: at Microsoft.Maui.LifecycleEvents.LifecycleEventService..ctor(IEnumerable`1) + 0x94 E AndroidRuntime: at Microsoft.Maui.LifecycleEvents.MauiAppHostBuilderExtensions.<>c.<ConfigureLifecycleEvents>b__0_0(IServiceProvider sp) + 0x3c E AndroidRuntime: at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitRootCache(ServiceCallSite, RuntimeResolverContext) + 0x68 E AndroidRuntime: at Microsoft.Extensions.DependencyInjection.ServiceProvider.CreateServiceAccessor(ServiceIdentifier serviceIdentifier) + 0x180 E AndroidRuntime: at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey, Func`2) + 0x11c E AndroidRuntime: at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(ServiceIdentifier, ServiceProviderEngineScope) + 0x44 E AndroidRuntime: at Microsoft.Maui.MauiContext.WrappedServiceProvider.GetService(Type) + 0x48 E AndroidRuntime: at Microsoft.Maui.MauiContext.WrappedServiceProvider.GetService(Type) + 0x48 E AndroidRuntime: at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider) + 0x3c E AndroidRuntime: at Microsoft.Maui.LifecycleEvents.LifecycleEventServiceExtensions.<GetLifecycleEventDelegates>d__3`1.MoveNext() + 0x38 E AndroidRuntime: at Microsoft.Maui.LifecycleEvents.LifecycleEventServiceExtensions.InvokeLifecycleEvents[TDelegate](IServiceProvider, Action`1) + 0x68 E AndroidRuntime: at Microsoft.Maui.MauiApplication.OnCreate() + 0xb0 E AndroidRuntime: at Android.App.Application.n_OnCreate(IntPtr jnienv, IntPtr native__this) + 0xb0 E AndroidRuntime: at my.MainApplication.n_onCreate(Native Method) E AndroidRuntime: at my.MainApplication.onCreate(MainApplication.java:24) E AndroidRuntime: at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1386) E AndroidRuntime: at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7398) E AndroidRuntime: at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0) E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2379) E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:107) E AndroidRuntime: at android.os.Looper.loopOnce(Looper.java:232) E AndroidRuntime: at android.os.Looper.loop(Looper.java:317) E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:8592) E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580) E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:878) This also allows us to remove these fields that are now unused: * `JnienvInitializeArgs.Class_forName` * `JNIEnv.BinaryName()` TODO? While `JNIEnv.FindClass()` was using [`Class.forName()`][0], `JniEnvironment.Types.FindClass()` uses [`ClassLoader.loadClass()`][1]. `JNIEnv.FindClass()` originally used `ClassLoader.loadClass()`, but was changed to use `Class.forName()` in xamarin/monodroid@ed984a3a as part of supporting the Xamarin.Android Designer. Updating `JNIEnv.FindClass()` to use `JniEnvironment.Types.FindClass()` effectively reverts that original change. This is "fine" for now -- the Xamarin.Android Designer is no longer supported -- but in the future we may want to update `JniEnvironment.Types.FindClass()` to use `Class.forName()`; see dotnet/java-interop#23. [0]: https://developer.android.com/reference/java/lang/Class#forName(java.lang.String) [1]: https://developer.android.com/reference/java/lang/ClassLoader#loadClass(java.lang.String)
- Loading branch information