diff --git a/src/Mono.Android/Java.Interop/TypeManager.cs b/src/Mono.Android/Java.Interop/TypeManager.cs index 3b900017db2..9d71981804f 100644 --- a/src/Mono.Android/Java.Interop/TypeManager.cs +++ b/src/Mono.Android/Java.Interop/TypeManager.cs @@ -286,16 +286,20 @@ internal static IJavaPeerable CreateInstance (IntPtr handle, JniHandleOwnership JNIEnv.DeleteLocalRef (class_ptr); + if (targetType != null && + (type == null || + !targetType.IsAssignableFrom (type))) { + type = targetType; + } + if (type == null) { + class_name = JNIEnv.GetClassNameFromInstance (handle); JNIEnv.DeleteRef (handle, transfer); throw new NotSupportedException ( - FormattableString.Invariant ($"Internal error finding wrapper class for '{JNIEnv.GetClassNameFromInstance (handle)}'. (Where is the Java.Lang.Object wrapper?!)"), + FormattableString.Invariant ($"Internal error finding wrapper class for '{class_name}'. (Where is the Java.Lang.Object wrapper?!)"), CreateJavaLocationException ()); } - if (targetType != null && !targetType.IsAssignableFrom (type)) - type = targetType; - if (type.IsInterface || type.IsAbstract) { var invokerType = JavaObjectExtensions.GetInvokerType (type); if (invokerType == null)