diff --git a/src/Microsoft.Android.Runtime.NativeAOT/Android.Runtime.NativeAOT/JavaInteropRuntime.cs b/src/Microsoft.Android.Runtime.NativeAOT/Android.Runtime.NativeAOT/JavaInteropRuntime.cs index 1d0aae0ff41..a4fadb5cc7a 100644 --- a/src/Microsoft.Android.Runtime.NativeAOT/Android.Runtime.NativeAOT/JavaInteropRuntime.cs +++ b/src/Microsoft.Android.Runtime.NativeAOT/Android.Runtime.NativeAOT/JavaInteropRuntime.cs @@ -41,7 +41,7 @@ static void init (IntPtr jnienv, IntPtr klass) var options = new NativeAotRuntimeOptions { EnvironmentPointer = jnienv, TypeManager = typeManager, - ValueManager = new NativeAotValueManager (typeManager), + ValueManager = new ManagedValueManager (), UseMarshalMemberBuilder = false, JniGlobalReferenceLogWriter = settings.GrefLog, JniLocalReferenceLogWriter = settings.LrefLog, diff --git a/src/Microsoft.Android.Runtime.NativeAOT/Java.Interop/JreRuntime.cs b/src/Microsoft.Android.Runtime.NativeAOT/Java.Interop/JreRuntime.cs index 630707a17cc..07ecd1037db 100644 --- a/src/Microsoft.Android.Runtime.NativeAOT/Java.Interop/JreRuntime.cs +++ b/src/Microsoft.Android.Runtime.NativeAOT/Java.Interop/JreRuntime.cs @@ -61,7 +61,7 @@ static NativeAotRuntimeOptions CreateJreVM (NativeAotRuntimeOptions builder) builder.TypeManager ??= new NativeAotTypeManager (); #endif // NET - builder.ValueManager ??= new NativeAotValueManager (builder.TypeManager); + builder.ValueManager ??= new ManagedValueManager (); builder.ObjectReferenceManager ??= new ManagedObjectReferenceManager (builder.JniGlobalReferenceLogWriter, builder.JniLocalReferenceLogWriter); if (builder.InvocationPointer != IntPtr.Zero || builder.EnvironmentPointer != IntPtr.Zero) diff --git a/src/Mono.Android/Android.Runtime/AndroidRuntime.cs b/src/Mono.Android/Android.Runtime/AndroidRuntime.cs index abf30a6ef4b..fa62ebce7bf 100644 --- a/src/Mono.Android/Android.Runtime/AndroidRuntime.cs +++ b/src/Mono.Android/Android.Runtime/AndroidRuntime.cs @@ -23,12 +23,14 @@ class AndroidRuntime : JniRuntime { internal AndroidRuntime (IntPtr jnienv, IntPtr vm, IntPtr classLoader, - IntPtr classLoader_loadClass, + JniRuntime.JniTypeManager? typeManager, + JniRuntime.JniValueManager? valueManager, bool jniAddNativeMethodRegistrationAttributePresent) : base (new AndroidRuntimeOptions (jnienv, vm, classLoader, - classLoader_loadClass, + typeManager, + valueManager, jniAddNativeMethodRegistrationAttributePresent)) { // This is not ideal, but we need to set this while the runtime is initializing but we can't do it directly from the `JNIEnvInit.Initialize` method, since @@ -93,16 +95,16 @@ class AndroidRuntimeOptions : JniRuntime.CreationOptions { public AndroidRuntimeOptions (IntPtr jnienv, IntPtr vm, IntPtr classLoader, - IntPtr classLoader_loadClass, + JniRuntime.JniTypeManager? typeManager, + JniRuntime.JniValueManager? valueManager, bool jniAddNativeMethodRegistrationAttributePresent) { EnvironmentPointer = jnienv; ClassLoader = new JniObjectReference (classLoader, JniObjectReferenceType.Global); - ClassLoader_LoadClass_id= classLoader_loadClass; InvocationPointer = vm; ObjectReferenceManager = new AndroidObjectReferenceManager (); - TypeManager = new AndroidTypeManager (jniAddNativeMethodRegistrationAttributePresent); - ValueManager = new AndroidValueManager (); + TypeManager = typeManager ?? new AndroidTypeManager (jniAddNativeMethodRegistrationAttributePresent); + ValueManager = valueManager ?? new AndroidValueManager (); UseMarshalMemberBuilder = false; JniAddNativeMethodRegistrationAttributePresent = jniAddNativeMethodRegistrationAttributePresent; } diff --git a/src/Mono.Android/Android.Runtime/JNIEnvInit.cs b/src/Mono.Android/Android.Runtime/JNIEnvInit.cs index cb6f9935c4c..873965d4c3f 100644 --- a/src/Mono.Android/Android.Runtime/JNIEnvInit.cs +++ b/src/Mono.Android/Android.Runtime/JNIEnvInit.cs @@ -8,6 +8,8 @@ using Java.Interop; using Java.Interop.Tools.TypeNameMappings; +using Microsoft.Android.Runtime; + namespace Android.Runtime { static internal class JNIEnvInit @@ -108,7 +110,14 @@ internal static unsafe void Initialize (JnienvInitializeArgs* args) java_class_loader = args->grefLoader; BoundExceptionType = (BoundExceptionType)args->ioExceptionType; - androidRuntime = new AndroidRuntime (args->env, args->javaVm, args->grefLoader, args->Loader_loadClass, args->jniAddNativeMethodRegistrationAttributePresent != 0); + androidRuntime = new AndroidRuntime ( + args->env, + args->javaVm, + args->grefLoader, + null, + RuntimeType != DotNetRuntimeType.MonoVM ? new ManagedValueManager () : null, + args->jniAddNativeMethodRegistrationAttributePresent != 0 + ); ValueManager = androidRuntime.ValueManager; IsRunningOnDesktop = args->isRunningOnDesktop == 1; diff --git a/src/Microsoft.Android.Runtime.NativeAOT/Android.Runtime.NativeAOT/NativeAotValueManager.cs b/src/Mono.Android/Microsoft.Android.Runtime/ManagedValueManager.cs similarity index 91% rename from src/Microsoft.Android.Runtime.NativeAOT/Android.Runtime.NativeAOT/NativeAotValueManager.cs rename to src/Mono.Android/Microsoft.Android.Runtime/ManagedValueManager.cs index e54d49ca7e4..616217ca4bc 100644 --- a/src/Microsoft.Android.Runtime.NativeAOT/Android.Runtime.NativeAOT/NativeAotValueManager.cs +++ b/src/Mono.Android/Microsoft.Android.Runtime/ManagedValueManager.cs @@ -16,15 +16,15 @@ namespace Microsoft.Android.Runtime; -class NativeAotValueManager : JniRuntime.JniValueManager +class ManagedValueManager : JniRuntime.JniValueManager { const DynamicallyAccessedMemberTypes Constructors = DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors; - readonly JniRuntime.JniTypeManager TypeManager; Dictionary>? RegisteredInstances = new Dictionary>(); - public NativeAotValueManager(JniRuntime.JniTypeManager typeManager) => - TypeManager = typeManager; + internal ManagedValueManager () + { + } public override void WaitForGCBridgeProcessing () { @@ -33,7 +33,7 @@ public override void WaitForGCBridgeProcessing () public override void CollectPeers () { if (RegisteredInstances == null) - throw new ObjectDisposedException (nameof (NativeAotValueManager)); + throw new ObjectDisposedException (nameof (ManagedValueManager)); var peers = new List (); @@ -62,7 +62,7 @@ public override void CollectPeers () public override void AddPeer (IJavaPeerable value) { if (RegisteredInstances == null) - throw new ObjectDisposedException (nameof (NativeAotValueManager)); + throw new ObjectDisposedException (nameof (ManagedValueManager)); var r = value.PeerReference; if (!r.IsValid) @@ -127,7 +127,7 @@ void WarnNotReplacing (int key, IJavaPeerable ignoreValue, IJavaPeerable keepVal public override IJavaPeerable? PeekPeer (JniObjectReference reference) { if (RegisteredInstances == null) - throw new ObjectDisposedException (nameof (NativeAotValueManager)); + throw new ObjectDisposedException (nameof (ManagedValueManager)); if (!reference.IsValid) return null; @@ -153,7 +153,7 @@ void WarnNotReplacing (int key, IJavaPeerable ignoreValue, IJavaPeerable keepVal public override void RemovePeer (IJavaPeerable value) { if (RegisteredInstances == null) - throw new ObjectDisposedException (nameof (NativeAotValueManager)); + throw new ObjectDisposedException (nameof (ManagedValueManager)); if (value == null) throw new ArgumentNullException (nameof (value)); @@ -230,7 +230,7 @@ public override void ActivatePeer (IJavaPeerable? self, JniObjectReference refer void ActivateViaReflection (JniObjectReference reference, ConstructorInfo cinfo, object?[]? argumentValues) { - var declType = cinfo.DeclaringType ?? throw new NotSupportedException ("Do not know the type to create!"); + var declType = GetDeclaringType (cinfo); #pragma warning disable IL2072 var self = (IJavaPeerable) System.Runtime.CompilerServices.RuntimeHelpers.GetUninitializedObject (declType); @@ -238,12 +238,17 @@ void ActivateViaReflection (JniObjectReference reference, ConstructorInfo cinfo, self.SetPeerReference (reference); cinfo.Invoke (self, argumentValues); + + [UnconditionalSuppressMessage ("Trimming", "IL2073", Justification = "🤷‍♂️")] + [return: DynamicallyAccessedMembers (Constructors)] + Type GetDeclaringType (ConstructorInfo cinfo) => + cinfo.DeclaringType ?? throw new NotSupportedException ("Do not know the type to create!"); } public override List GetSurfacedPeers () { if (RegisteredInstances == null) - throw new ObjectDisposedException (nameof (NativeAotValueManager)); + throw new ObjectDisposedException (nameof (ManagedValueManager)); lock (RegisteredInstances) { var peers = new List (RegisteredInstances.Count); diff --git a/src/Mono.Android/Mono.Android.csproj b/src/Mono.Android/Mono.Android.csproj index 51f06fbd502..229a3b8d116 100644 --- a/src/Mono.Android/Mono.Android.csproj +++ b/src/Mono.Android/Mono.Android.csproj @@ -349,6 +349,7 @@ +