|
17 | 17 | namespace Android.Runtime { |
18 | 18 | public static partial class JNIEnv { |
19 | 19 | const DynamicallyAccessedMemberTypes Constructors = DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors; |
| 20 | + const DynamicallyAccessedMemberTypes ConstructorsInterfaces = Constructors | DynamicallyAccessedMemberTypes.Interfaces; |
20 | 21 |
|
21 | 22 | [ThreadStatic] |
22 | 23 | static byte[]? mvid_bytes; |
@@ -322,6 +323,21 @@ public static IntPtr FindClass (System.Type type) |
322 | 323 | } |
323 | 324 | } |
324 | 325 |
|
| 326 | + internal static JniObjectReferenceOptions ToJniObjectReferenceOptions (JniHandleOwnership transfer) |
| 327 | + { |
| 328 | + switch (transfer) { |
| 329 | + case JniHandleOwnership.DoNotTransfer: |
| 330 | + return JniObjectReferenceOptions.Copy; |
| 331 | + case JniHandleOwnership.TransferGlobalRef: |
| 332 | + case JniHandleOwnership.TransferLocalRef: |
| 333 | + return JniObjectReferenceOptions.CopyAndDispose; |
| 334 | + case JniHandleOwnership.DoNotRegister: |
| 335 | + return JniObjectReferenceOptions.CopyAndDoNotRegister; |
| 336 | + default: |
| 337 | + throw new ArgumentOutOfRangeException (nameof (transfer), transfer, "Invalid JniHandleOwnership value."); |
| 338 | + } |
| 339 | + } |
| 340 | + |
325 | 341 | const int nameBufferLength = 1024; |
326 | 342 | [ThreadStatic] static char[]? nameBuffer; |
327 | 343 |
|
@@ -704,7 +720,13 @@ public static void CopyArray (IntPtr src, string[] dest) |
704 | 720 | AssertIsJavaObject (type); |
705 | 721 |
|
706 | 722 | IntPtr elem = GetObjectArrayElement (source, index); |
707 | | - return Java.Lang.Object.GetObject (elem, JniHandleOwnership.TransferLocalRef, type); |
| 723 | + return GetObject (elem, type); |
| 724 | + |
| 725 | + // FIXME: Since a Dictionary<Type, Func> is used here, the trimmer will not be able to properly analyze `Type t` |
| 726 | + // error IL2111: Method 'lambda expression' with parameters or return value with `DynamicallyAccessedMembersAttribute` is accessed via reflection. Trimmer can't guarantee availability of the requirements of the method. |
| 727 | + [UnconditionalSuppressMessage ("Trimming", "IL2067", Justification = "FIXME: https://github.com/xamarin/xamarin-android/issues/8724")] |
| 728 | + static object? GetObject (IntPtr e, Type t) => |
| 729 | + Java.Lang.Object.GetObject (e, JniHandleOwnership.TransferLocalRef, t); |
708 | 730 | } }, |
709 | 731 | { typeof (Array), (type, source, index) => { |
710 | 732 | IntPtr elem = GetObjectArrayElement (source, index); |
@@ -1135,7 +1157,7 @@ static int _GetArrayLength (IntPtr array_ptr) |
1135 | 1157 | } |
1136 | 1158 |
|
1137 | 1159 | public static T[]? GetArray< |
1138 | | - [DynamicallyAccessedMembers (Constructors)] |
| 1160 | + [DynamicallyAccessedMembers (ConstructorsInterfaces)] |
1139 | 1161 | T |
1140 | 1162 | > (Java.Lang.Object[] array) |
1141 | 1163 | { |
@@ -1252,7 +1274,7 @@ static IntPtr GetArrayElementClass<T>(T[] values) |
1252 | 1274 | } |
1253 | 1275 |
|
1254 | 1276 | public static void CopyObjectArray< |
1255 | | - [DynamicallyAccessedMembers (Constructors)] |
| 1277 | + [DynamicallyAccessedMembers (ConstructorsInterfaces)] |
1256 | 1278 | T |
1257 | 1279 | >(IntPtr source, T[] destination) |
1258 | 1280 | { |
|
0 commit comments