diff --git a/src/Microsoft.Android.Sdk.TrimmableTypeMap/Generator/ModelBuilder.cs b/src/Microsoft.Android.Sdk.TrimmableTypeMap/Generator/ModelBuilder.cs index 996ce142a13..79570a14bda 100644 --- a/src/Microsoft.Android.Sdk.TrimmableTypeMap/Generator/ModelBuilder.cs +++ b/src/Microsoft.Android.Sdk.TrimmableTypeMap/Generator/ModelBuilder.cs @@ -177,10 +177,18 @@ static void EmitPeers (TypeMapAssemblyData model, string jniName, } // Base JNI name entry → alias holder (self-referencing trim target, kept alive by associations) + // When ForceUnconditionalEntries is true we MUST emit this as 2-arg (unconditional) just + // like BuildEntry does: dotnet/runtime#127004 strips the TypeMapAssociation that keeps the + // holder alive when a TypeMap entry references the same type, leaving the dictionary key + // missing at runtime and breaking hierarchy lookups for essential types like + // java/lang/String and java/lang/Object. + bool aliasBaseUnconditional = ForceUnconditionalEntries + || EssentialRuntimeTypes.Contains (jniName) + || peersForName.Any (IsUnconditionalEntry); model.Entries.Add (new TypeMapAttributeData { JniName = jniName, ProxyTypeReference = holderRef, - TargetTypeReference = holderRef, + TargetTypeReference = aliasBaseUnconditional ? null : holderRef, }); model.AliasHolders.Add (new AliasHolderData { diff --git a/tests/Mono.Android-Tests/Mono.Android-Tests/Xamarin.Android.RuntimeTests/NUnitInstrumentation.cs b/tests/Mono.Android-Tests/Mono.Android-Tests/Xamarin.Android.RuntimeTests/NUnitInstrumentation.cs index 63c219c712a..d24d53ad324 100644 --- a/tests/Mono.Android-Tests/Mono.Android-Tests/Xamarin.Android.RuntimeTests/NUnitInstrumentation.cs +++ b/tests/Mono.Android-Tests/Mono.Android-Tests/Xamarin.Android.RuntimeTests/NUnitInstrumentation.cs @@ -85,9 +85,6 @@ protected NUnitInstrumentation(IntPtr handle, JniHandleOwnership transfer) // Throwable subclass registration "Java.InteropTests.JnienvTest.ActivatedDirectThrowableSubclassesShouldBeRegistered", - // Typemap doesn't resolve most-derived type - "Java.LangTests.ObjectTest.GetObject_ReturnsMostDerivedType", - // Instance identity after JNI round-trip "Java.LangTests.ObjectTest.JnienvCreateInstance_RegistersMultipleInstances",