Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Switch JniEnvironment.FindClass to use Class.forName instead of ClassLoader.loadClass #23

Open
garuma opened this issue Apr 11, 2016 · 0 comments
Labels
enhancement Proposed change to current functionality java-interop Runtime bridge between .NET and Java

Comments

@garuma
Copy link

garuma commented Apr 11, 2016

See equivalent commit in monodroid: https://github.com/xamarin/monodroid/commit/ed984a3a0bfbe71f6499a7855c647b5bc2b28466

@jpobst jpobst added enhancement Proposed change to current functionality java-interop Runtime bridge between .NET and Java labels Apr 16, 2020
jonpryor pushed a commit to dotnet/android that referenced this issue Feb 8, 2025
…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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement Proposed change to current functionality java-interop Runtime bridge between .NET and Java
Projects
None yet
Development

No branches or pull requests

2 participants