public static IDictionary <K, V>?FromJniHandle(IntPtr handle, JniHandleOwnership transfer) { if (handle == IntPtr.Zero) { return(null); } var inst = (IJavaObject?)Java.Lang.Object.PeekObject(handle); if (inst == null) { inst = new JavaDictionary <K, V> (handle, transfer); } else { JNIEnv.DeleteRef(handle, transfer); } return((IDictionary <K, V>)inst); }
internal static IJavaPeerable CreateInstance(IntPtr handle, JniHandleOwnership transfer, Type targetType) { Type type = null; IntPtr class_ptr = JNIEnv.GetObjectClass(handle); string class_name = GetClassName(class_ptr); lock (TypeManagerMapDictionaries.AccessLock) { while (class_ptr != IntPtr.Zero && !TypeManagerMapDictionaries.JniToManaged.TryGetValue(class_name, out type)) { type = GetJavaToManagedType(class_name); if (type != null) { TypeManagerMapDictionaries.JniToManaged.Add(class_name, type); break; } IntPtr super_class_ptr = JNIEnv.GetSuperclass(class_ptr); JNIEnv.DeleteLocalRef(class_ptr); class_ptr = super_class_ptr; class_name = GetClassName(class_ptr); } } JNIEnv.DeleteLocalRef(class_ptr); if (type == null) { JNIEnv.DeleteRef(handle, transfer); throw new NotSupportedException( string.Format("Internal error finding wrapper class for '{0}'. (Where is the Java.Lang.Object wrapper?!)", JNIEnv.GetClassNameFromInstance(handle)), CreateJavaLocationException()); } if (targetType != null && !targetType.IsAssignableFrom(type)) { type = targetType; } if (type.IsInterface || type.IsAbstract) { var invokerType = JavaObjectExtensions.GetHelperType(type, "Invoker"); if (invokerType == null) { throw new NotSupportedException("Unable to find Invoker for type '" + type.FullName + "'. Was it linked away?", CreateJavaLocationException()); } type = invokerType; } IJavaPeerable result = null; try { result = (IJavaPeerable)CreateProxy(type, handle, transfer); if (Runtime.IsGCUserPeer(result.PeerReference.Handle)) { result.SetJniManagedPeerState(JniManagedPeerStates.Replaceable); } } catch (MissingMethodException e) { var key_handle = JNIEnv.IdentityHash(handle); JNIEnv.DeleteRef(handle, transfer); throw new NotSupportedException( string.Format("Unable to activate instance of type {0} from native handle 0x{1} (key_handle 0x{2}).", type, handle.ToString("x"), key_handle.ToString("x")), e); } return(result); }