diff --git a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaClassInfo.cs b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaClassInfo.cs index ce7c7bb13..6936a2c41 100644 --- a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaClassInfo.cs +++ b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaClassInfo.cs @@ -218,7 +218,7 @@ Dictionary> LookupFields () for (int i = 0; i < len; ++i) { var field = JniEnvironment.Arrays.GetObjectArrayElement (fields, i); var n_name = Field_getName.CallVirtualObjectMethod (field); - var name = JniEnvironment.Strings.ToString (ref n_name, JniHandleOwnership.Transfer); + var name = JniEnvironment.Strings.ToString (ref n_name, JniObjectReferenceOptions.DisposeSourceReference); var isStatic = IsStatic (field); List overloads; @@ -226,7 +226,7 @@ Dictionary> LookupFields () Fields.Add (name, overloads = new List ()); var n_type = Field_getType.CallVirtualObjectMethod (field); - using (var type = new JniType (ref n_type, JniHandleOwnership.Transfer)) { + using (var type = new JniType (ref n_type, JniObjectReferenceOptions.DisposeSourceReference)) { var info = JniEnvironment.Current.JavaVM.GetJniTypeInfoForJniTypeReference (type.Name); overloads.Add (new JavaFieldInfo (Members, name + "\u0000" + info.JniTypeReference, isStatic)); } @@ -258,7 +258,7 @@ Dictionary> LookupMethods () for (int i = 0; i < len; ++i) { var method = JniEnvironment.Arrays.GetObjectArrayElement (methods, i); var n_name = Method_getName.CallVirtualObjectMethod (method); - var name = JniEnvironment.Strings.ToString (ref n_name, JniHandleOwnership.Transfer); + var name = JniEnvironment.Strings.ToString (ref n_name, JniObjectReferenceOptions.DisposeSourceReference); var isStatic = IsStatic (method); List overloads; @@ -266,7 +266,7 @@ Dictionary> LookupMethods () Methods.Add (name, overloads = new List ()); var nrt = Method_getReturnType.CallVirtualObjectMethod (method); - var rt = new JniType (ref nrt, JniHandleOwnership.Transfer); + var rt = new JniType (ref nrt, JniObjectReferenceOptions.DisposeSourceReference); var m = new JavaMethodInfo (Members, method, name, isStatic) { ReturnType = rt, }; diff --git a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaConstructorInfo.cs b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaConstructorInfo.cs index 804d75685..38a7ff42e 100644 --- a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaConstructorInfo.cs +++ b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaConstructorInfo.cs @@ -42,7 +42,7 @@ public override unsafe object Invoke (IJavaPeerable self, JValue* arguments) { if (self == null) { var h = members.InstanceMethods.StartCreateInstance (JniSignature, typeof (JavaInstanceProxy), arguments); - self = JniEnvironment.Current.JavaVM.GetObject (ref h, JniHandleOwnership.Transfer); + self = JniEnvironment.Current.JavaVM.GetObject (ref h, JniObjectReferenceOptions.DisposeSourceReference); } members.InstanceMethods.FinishCreateInstance (JniSignature, self, arguments); return new DynamicJavaInstance (self); diff --git a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaInstanceProxy.cs b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaInstanceProxy.cs index a780dbf09..9400cb6d6 100644 --- a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaInstanceProxy.cs +++ b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaInstanceProxy.cs @@ -18,7 +18,7 @@ namespace Java.Interop.Dynamic { [JniTypeInfoAttribute ("java/lang/Object")] class JavaInstanceProxy : JavaObject { - public JavaInstanceProxy (ref JniObjectReference reference, JniHandleOwnership transfer) + public JavaInstanceProxy (ref JniObjectReference reference, JniObjectReferenceOptions transfer) : base (ref reference, transfer) { } diff --git a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaMemberInfo.cs b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaMemberInfo.cs index 9b7e5a686..4ee461110 100644 --- a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaMemberInfo.cs +++ b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JavaMemberInfo.cs @@ -22,7 +22,7 @@ protected virtual void Dispose (bool disposing) protected static object ToReturnValue (ref JniObjectReference handle, string signature, int n) { - var instance = JniEnvironment.Current.JavaVM.GetObject (ref handle, JniHandleOwnership.Transfer); + var instance = JniEnvironment.Current.JavaVM.GetObject (ref handle, JniObjectReferenceOptions.DisposeSourceReference); switch (signature [n]) { case 'L': return new DynamicJavaInstance (instance); diff --git a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JniMetaObject.cs b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JniMetaObject.cs index 4c875894e..c212f66c6 100644 --- a/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JniMetaObject.cs +++ b/src/Java.Interop.Dynamic/Java.Interop.Dynamic/JniMetaObject.cs @@ -56,7 +56,7 @@ public override DynamicMetaObject BindConvert (ConvertBinder binder) return binder.FallbackConvert (this); var r = ConversionTarget; - var value = marshalInfo.GetValueFromJni (ref r, JniHandleOwnership.DoNotTransfer, binder.Type); + var value = marshalInfo.GetValueFromJni (ref r, JniObjectReferenceOptions.CreateNewReference, binder.Type); var valueE = Expression.Convert (Expression.Constant (value), binder.Type); return new DynamicMetaObject (valueE, BindingRestrictions.GetTypeRestriction (valueE, binder.Type), value); } diff --git a/src/Java.Interop.Export/Tests/Java.Interop/ExportTest.cs b/src/Java.Interop.Export/Tests/Java.Interop/ExportTest.cs index 7f81dbf59..26eb44e94 100644 --- a/src/Java.Interop.Export/Tests/Java.Interop/ExportTest.cs +++ b/src/Java.Interop.Export/Tests/Java.Interop/ExportTest.cs @@ -7,7 +7,7 @@ namespace Java.InteropTests [JniTypeInfo ("com/xamarin/interop/export/ExportType")] public class ExportTest : JavaObject { - public ExportTest (ref JniObjectReference reference, JniHandleOwnership transfer) + public ExportTest (ref JniObjectReference reference, JniObjectReferenceOptions transfer) : base (ref reference, transfer) { } diff --git a/src/Java.Interop.Export/Tests/Java.Interop/ExportedMemberBuilderTest.cs b/src/Java.Interop.Export/Tests/Java.Interop/ExportedMemberBuilderTest.cs index 1cc8045b1..a3f9010e9 100644 --- a/src/Java.Interop.Export/Tests/Java.Interop/ExportedMemberBuilderTest.cs +++ b/src/Java.Interop.Export/Tests/Java.Interop/ExportedMemberBuilderTest.cs @@ -61,7 +61,7 @@ static unsafe ExportTest CreateExportTest (JniType type) { var c = type.GetConstructor ("()V"); var p = type.NewObject (c, null); - return new ExportTest (ref p, JniHandleOwnership.Transfer); + return new ExportTest (ref p, JniObjectReferenceOptions.DisposeSourceReference); } [Test] diff --git a/src/Java.Interop/Java.Interop.csproj b/src/Java.Interop/Java.Interop.csproj index 28212550d..993b7aea2 100644 --- a/src/Java.Interop/Java.Interop.csproj +++ b/src/Java.Interop/Java.Interop.csproj @@ -57,7 +57,6 @@ - @@ -74,6 +73,7 @@ + diff --git a/src/Java.Interop/Java.Interop/JavaArray.cs b/src/Java.Interop/Java.Interop/JavaArray.cs index 5927cf14e..f41736649 100644 --- a/src/Java.Interop/Java.Interop/JavaArray.cs +++ b/src/Java.Interop/Java.Interop/JavaArray.cs @@ -8,14 +8,14 @@ namespace Java.Interop { public abstract class JavaArray : JavaObject, IList, IList { - internal delegate TArray ArrayCreator (ref JniObjectReference reference, JniHandleOwnership transfer) + internal delegate TArray ArrayCreator (ref JniObjectReference reference, JniObjectReferenceOptions transfer) where TArray : JavaArray; // Value was created via CreateMarshalCollection, and thus can // be disposed of with impunity when no longer needed. protected bool forMarshalCollection; - internal JavaArray (ref JniObjectReference handle, JniHandleOwnership transfer) + internal JavaArray (ref JniObjectReference handle, JniObjectReferenceOptions transfer) : base (ref handle, transfer) { } @@ -140,7 +140,7 @@ internal static JniObjectReference CreateLocalRef (object value, Func GetValueFromJni (ref JniObjectReference reference, JniHandleOwnership transfer, Type targetType, ArrayCreator creator) + internal static IList GetValueFromJni (ref JniObjectReference reference, JniObjectReferenceOptions transfer, Type targetType, ArrayCreator creator) where TArray : JavaArray { var value = JniEnvironment.Current.JavaVM.PeekObject (reference); @@ -350,7 +350,7 @@ public void Dispose () public abstract class JavaPrimitiveArray : JavaArray { - internal JavaPrimitiveArray (ref JniObjectReference reference, JniHandleOwnership transfer) + internal JavaPrimitiveArray (ref JniObjectReference reference, JniObjectReferenceOptions transfer) : base (ref reference, transfer) { } diff --git a/src/Java.Interop/Java.Interop/JavaException.cs b/src/Java.Interop/Java.Interop/JavaException.cs index fa723e29f..a71886b86 100644 --- a/src/Java.Interop/Java.Interop/JavaException.cs +++ b/src/Java.Interop/Java.Interop/JavaException.cs @@ -27,7 +27,7 @@ public unsafe JavaException () var peer = JniPeerMembers.InstanceMethods.StartCreateInstance ("()V", GetType (), null); using (SetPeerReference ( ref peer, - JniHandleOwnership.Transfer)) { + JniObjectReferenceOptions.DisposeSourceReference)) { JniPeerMembers.InstanceMethods.FinishCreateInstance ("()V", this, null); } javaStackTrace = _GetJavaStack (PeerReference); @@ -44,11 +44,11 @@ public unsafe JavaException (string message) var peer = JniPeerMembers.InstanceMethods.StartCreateInstance (signature, GetType (), args); using (SetPeerReference ( ref peer, - JniHandleOwnership.Transfer)) { + JniObjectReferenceOptions.DisposeSourceReference)) { JniPeerMembers.InstanceMethods.FinishCreateInstance (signature, this, args); } } finally { - JniEnvironment.References.Dispose (ref native_message, JniHandleOwnership.Transfer); + JniEnvironment.References.Dispose (ref native_message, JniObjectReferenceOptions.DisposeSourceReference); } javaStackTrace = _GetJavaStack (PeerReference); } @@ -64,19 +64,19 @@ public unsafe JavaException (string message, Exception innerException) var peer = JniPeerMembers.InstanceMethods.StartCreateInstance (signature, GetType (), args); using (SetPeerReference ( ref peer, - JniHandleOwnership.Transfer)) { + JniObjectReferenceOptions.DisposeSourceReference)) { JniPeerMembers.InstanceMethods.FinishCreateInstance (signature, this, args); } } finally { - JniEnvironment.References.Dispose (ref native_message, JniHandleOwnership.Transfer); + JniEnvironment.References.Dispose (ref native_message, JniObjectReferenceOptions.DisposeSourceReference); } javaStackTrace = _GetJavaStack (PeerReference); } - public JavaException (ref JniObjectReference reference, JniHandleOwnership transfer) + public JavaException (ref JniObjectReference reference, JniObjectReferenceOptions transfer) : base (_GetMessage (ref reference, transfer), _GetCause (ref reference, transfer)) { - if ((transfer & JniHandleOwnership.Invalid) == JniHandleOwnership.Invalid) + if (transfer == JniObjectReferenceOptions.Invalid) return; if (!reference.IsValid) @@ -121,7 +121,7 @@ public override string StackTrace { } } - protected SetSafeHandleCompletion SetPeerReference (ref JniObjectReference handle, JniHandleOwnership transfer) + protected SetSafeHandleCompletion SetPeerReference (ref JniObjectReference handle, JniObjectReferenceOptions transfer) { return JniEnvironment.Current.JavaVM.SetObjectPeerReference ( this, @@ -174,24 +174,24 @@ public override unsafe int GetHashCode () return _members.InstanceMethods.CallInt32Method ("hashCode\u0000()I", this, null); } - static string _GetMessage (ref JniObjectReference reference, JniHandleOwnership transfer) + static string _GetMessage (ref JniObjectReference reference, JniObjectReferenceOptions transfer) { - if ((transfer & JniHandleOwnership.Invalid) == JniHandleOwnership.Invalid) + if (transfer == JniObjectReferenceOptions.Invalid) return null; var m = _members.InstanceMethods.GetMethodID ("getMessage\u0000()Ljava/lang/String;"); var s = m.CallVirtualObjectMethod (reference); - return JniEnvironment.Strings.ToString (ref s, JniHandleOwnership.Transfer); + return JniEnvironment.Strings.ToString (ref s, JniObjectReferenceOptions.DisposeSourceReference); } - static Exception _GetCause (ref JniObjectReference reference, JniHandleOwnership transfer) + static Exception _GetCause (ref JniObjectReference reference, JniObjectReferenceOptions transfer) { - if ((transfer & JniHandleOwnership.Invalid) == JniHandleOwnership.Invalid) + if (transfer == JniObjectReferenceOptions.Invalid) return null; var m = _members.InstanceMethods.GetMethodID ("getCause\u0000()Ljava/lang/Throwable;"); var e = m.CallVirtualObjectMethod (reference); - return JniEnvironment.Current.JavaVM.GetExceptionForThrowable (ref e, JniHandleOwnership.Transfer); + return JniEnvironment.Current.JavaVM.GetExceptionForThrowable (ref e, JniObjectReferenceOptions.DisposeSourceReference); } unsafe string _GetJavaStack (JniObjectReference handle) @@ -211,12 +211,12 @@ unsafe string _GetJavaStack (JniObjectReference handle) pst_args [0] = new JValue (pwriter); pst.CallVirtualVoidMethod (handle, pst_args); var s = JniEnvironment.Current.Object_toString.CallVirtualObjectMethod (swriter); - return JniEnvironment.Strings.ToString (ref s, JniHandleOwnership.Transfer); + return JniEnvironment.Strings.ToString (ref s, JniObjectReferenceOptions.DisposeSourceReference); } finally { - JniEnvironment.References.Dispose (ref pwriter, JniHandleOwnership.Transfer); + JniEnvironment.References.Dispose (ref pwriter, JniObjectReferenceOptions.DisposeSourceReference); } } finally { - JniEnvironment.References.Dispose (ref swriter, JniHandleOwnership.Transfer); + JniEnvironment.References.Dispose (ref swriter, JniObjectReferenceOptions.DisposeSourceReference); } } } diff --git a/src/Java.Interop/Java.Interop/JavaObject.cs b/src/Java.Interop/Java.Interop/JavaObject.cs index b6d6fc765..3f3964598 100644 --- a/src/Java.Interop/Java.Interop/JavaObject.cs +++ b/src/Java.Interop/Java.Interop/JavaObject.cs @@ -43,9 +43,9 @@ public virtual JniPeerMembers JniPeerMembers { get {return _members;} } - public JavaObject (ref JniObjectReference reference, JniHandleOwnership transfer) + public JavaObject (ref JniObjectReference reference, JniObjectReferenceOptions transfer) { - if ((transfer & JniHandleOwnership.Invalid) == JniHandleOwnership.Invalid) + if (transfer == JniObjectReferenceOptions.Invalid) return; using (SetPeerReference (ref reference, transfer)) { @@ -57,12 +57,12 @@ public unsafe JavaObject () var peer = JniPeerMembers.InstanceMethods.StartCreateInstance ("()V", GetType (), null); using (SetPeerReference ( ref peer, - JniHandleOwnership.Transfer)) { + JniObjectReferenceOptions.DisposeSourceReference)) { JniPeerMembers.InstanceMethods.FinishCreateInstance ("()V", this, null); } } - protected SetPeerReferenceCompletion SetPeerReference (ref JniObjectReference handle, JniHandleOwnership transfer) + protected SetPeerReferenceCompletion SetPeerReference (ref JniObjectReference handle, JniObjectReferenceOptions transfer) { return JniEnvironment.Current.JavaVM.SetObjectPeerReference ( this, @@ -115,7 +115,7 @@ public override unsafe string ToString () "toString\u0000()Ljava/lang/String;", this, null); - return JniEnvironment.Strings.ToString (ref lref, JniHandleOwnership.Transfer); + return JniEnvironment.Strings.ToString (ref lref, JniObjectReferenceOptions.DisposeSourceReference); } int IJavaPeerableEx.IdentityHashCode { diff --git a/src/Java.Interop/Java.Interop/JavaObjectArray.cs b/src/Java.Interop/Java.Interop/JavaObjectArray.cs index 6ec5eb712..291605546 100644 --- a/src/Java.Interop/Java.Interop/JavaObjectArray.cs +++ b/src/Java.Interop/Java.Interop/JavaObjectArray.cs @@ -5,7 +5,7 @@ namespace Java.Interop { public class JavaObjectArray : JavaArray { - public JavaObjectArray (ref JniObjectReference handle, JniHandleOwnership transfer) + public JavaObjectArray (ref JniObjectReference handle, JniObjectReferenceOptions transfer) : base (ref handle, transfer) { } @@ -25,10 +25,10 @@ static JniObjectReference _NewArray (int length) } public unsafe JavaObjectArray (int length) - : this (ref *InvalidJniObjectReference, JniHandleOwnership.Invalid) + : this (ref *InvalidJniObjectReference, JniObjectReferenceOptions.Invalid) { var peer = _NewArray (CheckLength (length)); - using (SetPeerReference (ref peer, JniHandleOwnership.Transfer)) { + using (SetPeerReference (ref peer, JniObjectReferenceOptions.DisposeSourceReference)) { } } @@ -60,14 +60,14 @@ public override T this [int index] { T GetElementAt (int index) { var lref = JniEnvironment.Arrays.GetObjectArrayElement (PeerReference, index); - return JniMarshal.GetValue (ref lref, JniHandleOwnership.Transfer); + return JniMarshal.GetValue (ref lref, JniObjectReferenceOptions.DisposeSourceReference); } void SetElementAt (int index, T value) { var h = JniMarshal.CreateLocalRef (value); JniEnvironment.Arrays.SetObjectArrayElement (PeerReference, index, h); - JniEnvironment.References.Dispose (ref h, JniHandleOwnership.Transfer); + JniEnvironment.References.Dispose (ref h, JniObjectReferenceOptions.DisposeSourceReference); } public override IEnumerator GetEnumerator () @@ -85,7 +85,7 @@ public override void Clear () for (int i = 0; i < len; i++) { JniEnvironment.Arrays.SetObjectArrayElement (PeerReference, i, v); } - JniEnvironment.References.Dispose (ref v, JniHandleOwnership.Transfer); + JniEnvironment.References.Dispose (ref v, JniObjectReferenceOptions.DisposeSourceReference); } public override int IndexOf (T item) @@ -133,9 +133,9 @@ internal override bool TargetTypeIsCurrentType (Type targetType) targetType == typeof (JavaObjectArray); } - internal static object GetValue (ref JniObjectReference handle, JniHandleOwnership transfer, Type targetType) + internal static object GetValue (ref JniObjectReference handle, JniObjectReferenceOptions transfer, Type targetType) { - return JavaArray.GetValueFromJni (ref handle, transfer, targetType, (ref JniObjectReference h, JniHandleOwnership t) => new JavaObjectArray (ref h, t) { + return JavaArray.GetValueFromJni (ref handle, transfer, targetType, (ref JniObjectReference h, JniObjectReferenceOptions t) => new JavaObjectArray (ref h, t) { forMarshalCollection = true, }); } diff --git a/src/Java.Interop/Java.Interop/JavaPeerableExtensions.cs b/src/Java.Interop/Java.Interop/JavaPeerableExtensions.cs index 0af2f19c2..03df75a39 100644 --- a/src/Java.Interop/Java.Interop/JavaPeerableExtensions.cs +++ b/src/Java.Interop/Java.Interop/JavaPeerableExtensions.cs @@ -10,7 +10,7 @@ public static string GetJniTypeName (this IJavaPeerable self) return JniEnvironment.Types.GetJniTypeNameFromInstance (self.PeerReference); } - internal static object GetValue (ref JniObjectReference handle, JniHandleOwnership transfer, Type targetType) + internal static object GetValue (ref JniObjectReference handle, JniObjectReferenceOptions transfer, Type targetType) { return JniEnvironment.Current.JavaVM.GetObject (ref handle, transfer, targetType); } diff --git a/src/Java.Interop/Java.Interop/JavaPrimitiveArrays.cs b/src/Java.Interop/Java.Interop/JavaPrimitiveArrays.cs index 4913e05ac..bfefb6826 100644 --- a/src/Java.Interop/Java.Interop/JavaPrimitiveArrays.cs +++ b/src/Java.Interop/Java.Interop/JavaPrimitiveArrays.cs @@ -243,16 +243,16 @@ protected override void Synchronize (JniArrayElementsReleaseMode releaseMode) [JniTypeInfo ("Z", ArrayRank=1, TypeIsKeyword=true)] public sealed partial class JavaBooleanArray : JavaPrimitiveArray { - public JavaBooleanArray (ref JniObjectReference handle, JniHandleOwnership transfer) + public JavaBooleanArray (ref JniObjectReference handle, JniObjectReferenceOptions transfer) : base (ref handle, transfer) { } public unsafe JavaBooleanArray (int length) - : base (ref *InvalidJniObjectReference, JniHandleOwnership.Invalid) + : base (ref *InvalidJniObjectReference, JniObjectReferenceOptions.Invalid) { var peer = JniEnvironment.Arrays.NewBooleanArray (CheckLength (length)); - using (SetPeerReference (ref peer, JniHandleOwnership.Transfer)) { + using (SetPeerReference (ref peer, JniObjectReferenceOptions.DisposeSourceReference)) { } } @@ -344,13 +344,13 @@ internal static JniObjectReference CreateLocalRef (object value) list => new JavaBooleanArray (list)); } - internal static IList GetValueFromJni (ref JniObjectReference reference, JniHandleOwnership transfer, Type targetType) + internal static IList GetValueFromJni (ref JniObjectReference reference, JniObjectReferenceOptions transfer, Type targetType) { return JavaArray.GetValueFromJni ( ref reference, transfer, targetType, - (ref JniObjectReference h, JniHandleOwnership t) => new JavaBooleanArray (ref h, t)); + (ref JniObjectReference h, JniObjectReferenceOptions t) => new JavaBooleanArray (ref h, t)); } internal static IJavaPeerable CreateMarshalCollection (object value) @@ -389,16 +389,16 @@ protected override void Synchronize (JniArrayElementsReleaseMode releaseMode) [JniTypeInfo ("B", ArrayRank=1, TypeIsKeyword=true)] public sealed partial class JavaSByteArray : JavaPrimitiveArray { - public JavaSByteArray (ref JniObjectReference handle, JniHandleOwnership transfer) + public JavaSByteArray (ref JniObjectReference handle, JniObjectReferenceOptions transfer) : base (ref handle, transfer) { } public unsafe JavaSByteArray (int length) - : base (ref *InvalidJniObjectReference, JniHandleOwnership.Invalid) + : base (ref *InvalidJniObjectReference, JniObjectReferenceOptions.Invalid) { var peer = JniEnvironment.Arrays.NewByteArray (CheckLength (length)); - using (SetPeerReference (ref peer, JniHandleOwnership.Transfer)) { + using (SetPeerReference (ref peer, JniObjectReferenceOptions.DisposeSourceReference)) { } } @@ -490,13 +490,13 @@ internal static JniObjectReference CreateLocalRef (object value) list => new JavaSByteArray (list)); } - internal static IList GetValueFromJni (ref JniObjectReference reference, JniHandleOwnership transfer, Type targetType) + internal static IList GetValueFromJni (ref JniObjectReference reference, JniObjectReferenceOptions transfer, Type targetType) { return JavaArray.GetValueFromJni ( ref reference, transfer, targetType, - (ref JniObjectReference h, JniHandleOwnership t) => new JavaSByteArray (ref h, t)); + (ref JniObjectReference h, JniObjectReferenceOptions t) => new JavaSByteArray (ref h, t)); } internal static IJavaPeerable CreateMarshalCollection (object value) @@ -535,16 +535,16 @@ protected override void Synchronize (JniArrayElementsReleaseMode releaseMode) [JniTypeInfo ("C", ArrayRank=1, TypeIsKeyword=true)] public sealed partial class JavaCharArray : JavaPrimitiveArray { - public JavaCharArray (ref JniObjectReference handle, JniHandleOwnership transfer) + public JavaCharArray (ref JniObjectReference handle, JniObjectReferenceOptions transfer) : base (ref handle, transfer) { } public unsafe JavaCharArray (int length) - : base (ref *InvalidJniObjectReference, JniHandleOwnership.Invalid) + : base (ref *InvalidJniObjectReference, JniObjectReferenceOptions.Invalid) { var peer = JniEnvironment.Arrays.NewCharArray (CheckLength (length)); - using (SetPeerReference (ref peer, JniHandleOwnership.Transfer)) { + using (SetPeerReference (ref peer, JniObjectReferenceOptions.DisposeSourceReference)) { } } @@ -636,13 +636,13 @@ internal static JniObjectReference CreateLocalRef (object value) list => new JavaCharArray (list)); } - internal static IList GetValueFromJni (ref JniObjectReference reference, JniHandleOwnership transfer, Type targetType) + internal static IList GetValueFromJni (ref JniObjectReference reference, JniObjectReferenceOptions transfer, Type targetType) { return JavaArray.GetValueFromJni ( ref reference, transfer, targetType, - (ref JniObjectReference h, JniHandleOwnership t) => new JavaCharArray (ref h, t)); + (ref JniObjectReference h, JniObjectReferenceOptions t) => new JavaCharArray (ref h, t)); } internal static IJavaPeerable CreateMarshalCollection (object value) @@ -681,16 +681,16 @@ protected override void Synchronize (JniArrayElementsReleaseMode releaseMode) [JniTypeInfo ("S", ArrayRank=1, TypeIsKeyword=true)] public sealed partial class JavaInt16Array : JavaPrimitiveArray { - public JavaInt16Array (ref JniObjectReference handle, JniHandleOwnership transfer) + public JavaInt16Array (ref JniObjectReference handle, JniObjectReferenceOptions transfer) : base (ref handle, transfer) { } public unsafe JavaInt16Array (int length) - : base (ref *InvalidJniObjectReference, JniHandleOwnership.Invalid) + : base (ref *InvalidJniObjectReference, JniObjectReferenceOptions.Invalid) { var peer = JniEnvironment.Arrays.NewShortArray (CheckLength (length)); - using (SetPeerReference (ref peer, JniHandleOwnership.Transfer)) { + using (SetPeerReference (ref peer, JniObjectReferenceOptions.DisposeSourceReference)) { } } @@ -782,13 +782,13 @@ internal static JniObjectReference CreateLocalRef (object value) list => new JavaInt16Array (list)); } - internal static IList GetValueFromJni (ref JniObjectReference reference, JniHandleOwnership transfer, Type targetType) + internal static IList GetValueFromJni (ref JniObjectReference reference, JniObjectReferenceOptions transfer, Type targetType) { return JavaArray.GetValueFromJni ( ref reference, transfer, targetType, - (ref JniObjectReference h, JniHandleOwnership t) => new JavaInt16Array (ref h, t)); + (ref JniObjectReference h, JniObjectReferenceOptions t) => new JavaInt16Array (ref h, t)); } internal static IJavaPeerable CreateMarshalCollection (object value) @@ -827,16 +827,16 @@ protected override void Synchronize (JniArrayElementsReleaseMode releaseMode) [JniTypeInfo ("I", ArrayRank=1, TypeIsKeyword=true)] public sealed partial class JavaInt32Array : JavaPrimitiveArray { - public JavaInt32Array (ref JniObjectReference handle, JniHandleOwnership transfer) + public JavaInt32Array (ref JniObjectReference handle, JniObjectReferenceOptions transfer) : base (ref handle, transfer) { } public unsafe JavaInt32Array (int length) - : base (ref *InvalidJniObjectReference, JniHandleOwnership.Invalid) + : base (ref *InvalidJniObjectReference, JniObjectReferenceOptions.Invalid) { var peer = JniEnvironment.Arrays.NewIntArray (CheckLength (length)); - using (SetPeerReference (ref peer, JniHandleOwnership.Transfer)) { + using (SetPeerReference (ref peer, JniObjectReferenceOptions.DisposeSourceReference)) { } } @@ -928,13 +928,13 @@ internal static JniObjectReference CreateLocalRef (object value) list => new JavaInt32Array (list)); } - internal static IList GetValueFromJni (ref JniObjectReference reference, JniHandleOwnership transfer, Type targetType) + internal static IList GetValueFromJni (ref JniObjectReference reference, JniObjectReferenceOptions transfer, Type targetType) { return JavaArray.GetValueFromJni ( ref reference, transfer, targetType, - (ref JniObjectReference h, JniHandleOwnership t) => new JavaInt32Array (ref h, t)); + (ref JniObjectReference h, JniObjectReferenceOptions t) => new JavaInt32Array (ref h, t)); } internal static IJavaPeerable CreateMarshalCollection (object value) @@ -973,16 +973,16 @@ protected override void Synchronize (JniArrayElementsReleaseMode releaseMode) [JniTypeInfo ("J", ArrayRank=1, TypeIsKeyword=true)] public sealed partial class JavaInt64Array : JavaPrimitiveArray { - public JavaInt64Array (ref JniObjectReference handle, JniHandleOwnership transfer) + public JavaInt64Array (ref JniObjectReference handle, JniObjectReferenceOptions transfer) : base (ref handle, transfer) { } public unsafe JavaInt64Array (int length) - : base (ref *InvalidJniObjectReference, JniHandleOwnership.Invalid) + : base (ref *InvalidJniObjectReference, JniObjectReferenceOptions.Invalid) { var peer = JniEnvironment.Arrays.NewLongArray (CheckLength (length)); - using (SetPeerReference (ref peer, JniHandleOwnership.Transfer)) { + using (SetPeerReference (ref peer, JniObjectReferenceOptions.DisposeSourceReference)) { } } @@ -1074,13 +1074,13 @@ internal static JniObjectReference CreateLocalRef (object value) list => new JavaInt64Array (list)); } - internal static IList GetValueFromJni (ref JniObjectReference reference, JniHandleOwnership transfer, Type targetType) + internal static IList GetValueFromJni (ref JniObjectReference reference, JniObjectReferenceOptions transfer, Type targetType) { return JavaArray.GetValueFromJni ( ref reference, transfer, targetType, - (ref JniObjectReference h, JniHandleOwnership t) => new JavaInt64Array (ref h, t)); + (ref JniObjectReference h, JniObjectReferenceOptions t) => new JavaInt64Array (ref h, t)); } internal static IJavaPeerable CreateMarshalCollection (object value) @@ -1119,16 +1119,16 @@ protected override void Synchronize (JniArrayElementsReleaseMode releaseMode) [JniTypeInfo ("F", ArrayRank=1, TypeIsKeyword=true)] public sealed partial class JavaSingleArray : JavaPrimitiveArray { - public JavaSingleArray (ref JniObjectReference handle, JniHandleOwnership transfer) + public JavaSingleArray (ref JniObjectReference handle, JniObjectReferenceOptions transfer) : base (ref handle, transfer) { } public unsafe JavaSingleArray (int length) - : base (ref *InvalidJniObjectReference, JniHandleOwnership.Invalid) + : base (ref *InvalidJniObjectReference, JniObjectReferenceOptions.Invalid) { var peer = JniEnvironment.Arrays.NewFloatArray (CheckLength (length)); - using (SetPeerReference (ref peer, JniHandleOwnership.Transfer)) { + using (SetPeerReference (ref peer, JniObjectReferenceOptions.DisposeSourceReference)) { } } @@ -1220,13 +1220,13 @@ internal static JniObjectReference CreateLocalRef (object value) list => new JavaSingleArray (list)); } - internal static IList GetValueFromJni (ref JniObjectReference reference, JniHandleOwnership transfer, Type targetType) + internal static IList GetValueFromJni (ref JniObjectReference reference, JniObjectReferenceOptions transfer, Type targetType) { return JavaArray.GetValueFromJni ( ref reference, transfer, targetType, - (ref JniObjectReference h, JniHandleOwnership t) => new JavaSingleArray (ref h, t)); + (ref JniObjectReference h, JniObjectReferenceOptions t) => new JavaSingleArray (ref h, t)); } internal static IJavaPeerable CreateMarshalCollection (object value) @@ -1265,16 +1265,16 @@ protected override void Synchronize (JniArrayElementsReleaseMode releaseMode) [JniTypeInfo ("D", ArrayRank=1, TypeIsKeyword=true)] public sealed partial class JavaDoubleArray : JavaPrimitiveArray { - public JavaDoubleArray (ref JniObjectReference handle, JniHandleOwnership transfer) + public JavaDoubleArray (ref JniObjectReference handle, JniObjectReferenceOptions transfer) : base (ref handle, transfer) { } public unsafe JavaDoubleArray (int length) - : base (ref *InvalidJniObjectReference, JniHandleOwnership.Invalid) + : base (ref *InvalidJniObjectReference, JniObjectReferenceOptions.Invalid) { var peer = JniEnvironment.Arrays.NewDoubleArray (CheckLength (length)); - using (SetPeerReference (ref peer, JniHandleOwnership.Transfer)) { + using (SetPeerReference (ref peer, JniObjectReferenceOptions.DisposeSourceReference)) { } } @@ -1366,13 +1366,13 @@ internal static JniObjectReference CreateLocalRef (object value) list => new JavaDoubleArray (list)); } - internal static IList GetValueFromJni (ref JniObjectReference reference, JniHandleOwnership transfer, Type targetType) + internal static IList GetValueFromJni (ref JniObjectReference reference, JniObjectReferenceOptions transfer, Type targetType) { return JavaArray.GetValueFromJni ( ref reference, transfer, targetType, - (ref JniObjectReference h, JniHandleOwnership t) => new JavaDoubleArray (ref h, t)); + (ref JniObjectReference h, JniObjectReferenceOptions t) => new JavaDoubleArray (ref h, t)); } internal static IJavaPeerable CreateMarshalCollection (object value) diff --git a/src/Java.Interop/Java.Interop/JavaVM.cs b/src/Java.Interop/Java.Interop/JavaVM.cs index fd2f6c7be..20b9b0125 100644 --- a/src/Java.Interop/Java.Interop/JavaVM.cs +++ b/src/Java.Interop/Java.Interop/JavaVM.cs @@ -222,7 +222,7 @@ public void DestroyJavaVM () Invoker.DestroyJavaVM (InvocationPointer); } - public virtual Exception GetExceptionForThrowable (ref JniObjectReference value, JniHandleOwnership transfer) + public virtual Exception GetExceptionForThrowable (ref JniObjectReference value, JniObjectReferenceOptions transfer) { var o = PeekObject (value); var e = o as JavaException; @@ -298,7 +298,7 @@ internal void RegisterObject (T value) if (r.Type != JniObjectReferenceType.Global) { value.SetPeerReference (r.NewGlobalRef ()); - JniEnvironment.References.Dispose (ref r, JniHandleOwnership.Transfer); + JniEnvironment.References.Dispose (ref r, JniObjectReferenceOptions.DisposeSourceReference); } int key = value.IdentityHashCode; lock (RegisteredInstances) { @@ -328,7 +328,7 @@ internal void UnRegisterObject (IJavaPeerableEx value) } } - internal TCleanup SetObjectPeerReference (T value, ref JniObjectReference reference, JniHandleOwnership transfer, Func createCleanup) + internal TCleanup SetObjectPeerReference (T value, ref JniObjectReference reference, JniObjectReferenceOptions transfer, Func createCleanup) where T : IJavaPeerable, IJavaPeerableEx where TCleanup : IDisposable { @@ -442,7 +442,7 @@ public IJavaPeerable PeekObject (JniObjectReference reference) return null; } - public IJavaPeerable GetObject (ref JniObjectReference reference, JniHandleOwnership transfer, Type targetType = null) + public IJavaPeerable GetObject (ref JniObjectReference reference, JniObjectReferenceOptions transfer, Type targetType = null) { if (!reference.IsValid) return null; @@ -456,7 +456,7 @@ public IJavaPeerable GetObject (ref JniObjectReference reference, JniHandleOwner return CreateObjectWrapper (ref reference, transfer, targetType); } - protected virtual IJavaPeerable CreateObjectWrapper (ref JniObjectReference reference, JniHandleOwnership transfer, Type targetType) + protected virtual IJavaPeerable CreateObjectWrapper (ref JniObjectReference reference, JniObjectReferenceOptions transfer, Type targetType) { targetType = targetType ?? typeof (JavaObject); if (!typeof (IJavaPeerable).IsAssignableFrom (targetType)) @@ -492,7 +492,7 @@ ConstructorInfo GetWrapperConstructor (JniObjectReference instance, Type fallbac if (type != null) { var ctor = type.GetConstructor (new[] { ByRefJniObjectReference, - typeof(JniHandleOwnership) + typeof(JniObjectReferenceOptions) }); if (ctor != null) { @@ -506,18 +506,18 @@ ConstructorInfo GetWrapperConstructor (JniObjectReference instance, Type fallbac ? JniEnvironment.Types.GetJniTypeNameFromClass (super) : null; - JniEnvironment.References.Dispose (ref klass, JniHandleOwnership.Transfer); + JniEnvironment.References.Dispose (ref klass, JniObjectReferenceOptions.DisposeSourceReference); klass = super; } - JniEnvironment.References.Dispose (ref klass, JniHandleOwnership.Transfer); + JniEnvironment.References.Dispose (ref klass, JniObjectReferenceOptions.DisposeSourceReference); return fallbackType.GetConstructor (new[] { ByRefJniObjectReference, - typeof(JniHandleOwnership) + typeof(JniObjectReferenceOptions) }); } - public T GetObject (ref JniObjectReference reference, JniHandleOwnership transfer) + public T GetObject (ref JniObjectReference reference, JniObjectReferenceOptions transfer) where T : IJavaPeerable { return (T) GetObject (ref reference, transfer, typeof (T)); @@ -528,7 +528,7 @@ public IJavaPeerable GetObject (IntPtr jniHandle, Type targetType = null) if (jniHandle == IntPtr.Zero) return null; var h = new JniObjectReference (jniHandle); - return GetObject (ref h, JniHandleOwnership.DoNotTransfer, targetType); + return GetObject (ref h, JniObjectReferenceOptions.CreateNewReference, targetType); } public T GetObject (IntPtr jniHandle) diff --git a/src/Java.Interop/Java.Interop/JniBuiltinMarshalers.cs b/src/Java.Interop/Java.Interop/JniBuiltinMarshalers.cs index 8fa679f7d..3a0ecc7f1 100644 --- a/src/Java.Interop/Java.Interop/JniBuiltinMarshalers.cs +++ b/src/Java.Interop/Java.Interop/JniBuiltinMarshalers.cs @@ -104,7 +104,7 @@ internal static unsafe JniObjectReference CreateLocalRef (object value) } static JniInstanceMethodInfo booleanValue; - internal static object GetValueFromJni (ref JniObjectReference self, JniHandleOwnership transfer, Type targetType) + internal static object GetValueFromJni (ref JniObjectReference self, JniObjectReferenceOptions transfer, Type targetType) { Debug.Assert (targetType == null || targetType == typeof (Boolean), "Expected targetType==typeof(Boolean); was: " + targetType); TypeRef.GetCachedInstanceMethod (ref booleanValue, "booleanValue", "()Z"); @@ -142,7 +142,7 @@ internal static unsafe JniObjectReference CreateLocalRef (object value) } static JniInstanceMethodInfo byteValue; - internal static object GetValueFromJni (ref JniObjectReference self, JniHandleOwnership transfer, Type targetType) + internal static object GetValueFromJni (ref JniObjectReference self, JniObjectReferenceOptions transfer, Type targetType) { Debug.Assert (targetType == null || targetType == typeof (SByte), "Expected targetType==typeof(SByte); was: " + targetType); TypeRef.GetCachedInstanceMethod (ref byteValue, "byteValue", "()B"); @@ -180,7 +180,7 @@ internal static unsafe JniObjectReference CreateLocalRef (object value) } static JniInstanceMethodInfo charValue; - internal static object GetValueFromJni (ref JniObjectReference self, JniHandleOwnership transfer, Type targetType) + internal static object GetValueFromJni (ref JniObjectReference self, JniObjectReferenceOptions transfer, Type targetType) { Debug.Assert (targetType == null || targetType == typeof (Char), "Expected targetType==typeof(Char); was: " + targetType); TypeRef.GetCachedInstanceMethod (ref charValue, "charValue", "()C"); @@ -218,7 +218,7 @@ internal static unsafe JniObjectReference CreateLocalRef (object value) } static JniInstanceMethodInfo shortValue; - internal static object GetValueFromJni (ref JniObjectReference self, JniHandleOwnership transfer, Type targetType) + internal static object GetValueFromJni (ref JniObjectReference self, JniObjectReferenceOptions transfer, Type targetType) { Debug.Assert (targetType == null || targetType == typeof (Int16), "Expected targetType==typeof(Int16); was: " + targetType); TypeRef.GetCachedInstanceMethod (ref shortValue, "shortValue", "()S"); @@ -256,7 +256,7 @@ internal static unsafe JniObjectReference CreateLocalRef (object value) } static JniInstanceMethodInfo intValue; - internal static object GetValueFromJni (ref JniObjectReference self, JniHandleOwnership transfer, Type targetType) + internal static object GetValueFromJni (ref JniObjectReference self, JniObjectReferenceOptions transfer, Type targetType) { Debug.Assert (targetType == null || targetType == typeof (Int32), "Expected targetType==typeof(Int32); was: " + targetType); TypeRef.GetCachedInstanceMethod (ref intValue, "intValue", "()I"); @@ -294,7 +294,7 @@ internal static unsafe JniObjectReference CreateLocalRef (object value) } static JniInstanceMethodInfo longValue; - internal static object GetValueFromJni (ref JniObjectReference self, JniHandleOwnership transfer, Type targetType) + internal static object GetValueFromJni (ref JniObjectReference self, JniObjectReferenceOptions transfer, Type targetType) { Debug.Assert (targetType == null || targetType == typeof (Int64), "Expected targetType==typeof(Int64); was: " + targetType); TypeRef.GetCachedInstanceMethod (ref longValue, "longValue", "()J"); @@ -332,7 +332,7 @@ internal static unsafe JniObjectReference CreateLocalRef (object value) } static JniInstanceMethodInfo floatValue; - internal static object GetValueFromJni (ref JniObjectReference self, JniHandleOwnership transfer, Type targetType) + internal static object GetValueFromJni (ref JniObjectReference self, JniObjectReferenceOptions transfer, Type targetType) { Debug.Assert (targetType == null || targetType == typeof (Single), "Expected targetType==typeof(Single); was: " + targetType); TypeRef.GetCachedInstanceMethod (ref floatValue, "floatValue", "()F"); @@ -370,7 +370,7 @@ internal static unsafe JniObjectReference CreateLocalRef (object value) } static JniInstanceMethodInfo doubleValue; - internal static object GetValueFromJni (ref JniObjectReference self, JniHandleOwnership transfer, Type targetType) + internal static object GetValueFromJni (ref JniObjectReference self, JniObjectReferenceOptions transfer, Type targetType) { Debug.Assert (targetType == null || targetType == typeof (Double), "Expected targetType==typeof(Double); was: " + targetType); TypeRef.GetCachedInstanceMethod (ref doubleValue, "doubleValue", "()D"); diff --git a/src/Java.Interop/Java.Interop/JniEnvironment.References.cs b/src/Java.Interop/Java.Interop/JniEnvironment.References.cs index 5d8e4aac0..234274cf6 100644 --- a/src/Java.Interop/Java.Interop/JniEnvironment.References.cs +++ b/src/Java.Interop/Java.Interop/JniEnvironment.References.cs @@ -9,18 +9,20 @@ static partial class References { public static void Dispose (ref JniObjectReference reference) { - Dispose (ref reference, JniHandleOwnership.Transfer); + Dispose (ref reference, JniObjectReferenceOptions.DisposeSourceReference); } - public static void Dispose (ref JniObjectReference reference, JniHandleOwnership transfer) + const JniObjectReferenceOptions TransferMask = JniObjectReferenceOptions.CreateNewReference | JniObjectReferenceOptions.DisposeSourceReference; + + public static void Dispose (ref JniObjectReference reference, JniObjectReferenceOptions transfer) { if (!reference.IsValid) return; - switch (transfer) { - case JniHandleOwnership.DoNotTransfer: + switch (transfer & TransferMask) { + case JniObjectReferenceOptions.CreateNewReference: break; - case JniHandleOwnership.Transfer: + case JniObjectReferenceOptions.DisposeSourceReference: switch (reference.Type) { case JniObjectReferenceType.Global: JniEnvironment.Current.JavaVM.JniObjectReferenceManager.DeleteGlobalReference (ref reference); diff --git a/src/Java.Interop/Java.Interop/JniEnvironment.Strings.cs b/src/Java.Interop/Java.Interop/JniEnvironment.Strings.cs index 0d88d2b0f..5f44b59a2 100644 --- a/src/Java.Interop/Java.Interop/JniEnvironment.Strings.cs +++ b/src/Java.Interop/Java.Interop/JniEnvironment.Strings.cs @@ -28,10 +28,10 @@ public static string ToString (IntPtr handle) public static unsafe string ToString (JniObjectReference value) { - return ToString (ref value, JniHandleOwnership.DoNotTransfer); + return ToString (ref value, JniObjectReferenceOptions.CreateNewReference); } - public static unsafe string ToString (ref JniObjectReference value, JniHandleOwnership transfer) + public static unsafe string ToString (ref JniObjectReference value, JniObjectReferenceOptions transfer) { if (!value.IsValid) return null; @@ -45,7 +45,7 @@ public static unsafe string ToString (ref JniObjectReference value, JniHandleOwn } } - internal static unsafe string ToString (ref JniObjectReference value, JniHandleOwnership transfer, Type targetType) + internal static unsafe string ToString (ref JniObjectReference value, JniObjectReferenceOptions transfer, Type targetType) { Debug.Assert (targetType == typeof (string), "Expected targetType==typeof(string); was: " + targetType); return ToString (ref value, transfer); diff --git a/src/Java.Interop/Java.Interop/JniEnvironment.Types.cs b/src/Java.Interop/Java.Interop/JniEnvironment.Types.cs index 3cc061211..9975cd32d 100644 --- a/src/Java.Interop/Java.Interop/JniEnvironment.Types.cs +++ b/src/Java.Interop/Java.Interop/JniEnvironment.Types.cs @@ -24,7 +24,7 @@ public static JniType GetTypeFromInstance (JniObjectReference reference) { var lref = JniEnvironment.Types.GetObjectClass (reference); if (lref.IsValid) - return new JniType (ref lref, JniHandleOwnership.Transfer); + return new JniType (ref lref, JniObjectReferenceOptions.DisposeSourceReference); return null; } @@ -35,14 +35,14 @@ public static string GetJniTypeNameFromInstance (JniObjectReference reference) return GetJniTypeNameFromClass (lref); } finally { - JniEnvironment.References.Dispose (ref lref, JniHandleOwnership.Transfer); + JniEnvironment.References.Dispose (ref lref, JniObjectReferenceOptions.DisposeSourceReference); } } public static string GetJniTypeNameFromClass (JniObjectReference reference) { var s = JniEnvironment.Current.Class_getName.CallVirtualObjectMethod (reference); - return JavaClassToJniType (Strings.ToString (ref s, JniHandleOwnership.Transfer)); + return JavaClassToJniType (Strings.ToString (ref s, JniObjectReferenceOptions.DisposeSourceReference)); } static string JavaClassToJniType (string value) diff --git a/src/Java.Interop/Java.Interop/JniEnvironment.cs b/src/Java.Interop/Java.Interop/JniEnvironment.cs index 5babba326..c78611212 100644 --- a/src/Java.Interop/Java.Interop/JniEnvironment.cs +++ b/src/Java.Interop/Java.Interop/JniEnvironment.cs @@ -258,7 +258,7 @@ public Exception GetExceptionForLastThrowable () // JniEnvironment.Errors.ExceptionDescribe (); JniEnvironment.Exceptions.ExceptionClear (); JniEnvironment.Current.LogCreateLocalRef (e); - return JavaVM.GetExceptionForThrowable (ref e, JniHandleOwnership.Transfer); + return JavaVM.GetExceptionForThrowable (ref e, JniObjectReferenceOptions.DisposeSourceReference); } } } diff --git a/src/Java.Interop/Java.Interop/JniHandleOwnership.cs b/src/Java.Interop/Java.Interop/JniHandleOwnership.cs deleted file mode 100644 index a8edf7f07..000000000 --- a/src/Java.Interop/Java.Interop/JniHandleOwnership.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -namespace Java.Interop -{ - [Flags] - public enum JniHandleOwnership // JniObjectReferenceOptions - { - DoNotTransfer = 0, - Transfer = 1, - Invalid = 2, - - /* - Invalid = 0, - CreateNewReference = 1, // DoNotTransfer - DisposeSourceReference = 2, // Transfer - Unregistered = 4, - */ - } -} - diff --git a/src/Java.Interop/Java.Interop/JniMarshal.cs b/src/Java.Interop/Java.Interop/JniMarshal.cs index f50e64193..41d583b6f 100644 --- a/src/Java.Interop/Java.Interop/JniMarshal.cs +++ b/src/Java.Interop/Java.Interop/JniMarshal.cs @@ -38,7 +38,7 @@ public static bool RecursiveEquals (object objA, object objB) return false; } - internal static T GetValue (ref JniObjectReference reference, JniHandleOwnership transfer) + internal static T GetValue (ref JniObjectReference reference, JniObjectReferenceOptions transfer) { if (!reference.IsValid) return default (T); diff --git a/src/Java.Interop/Java.Interop/JniMarshalInfo.cs b/src/Java.Interop/Java.Interop/JniMarshalInfo.cs index 01fbaee05..30388d686 100644 --- a/src/Java.Interop/Java.Interop/JniMarshalInfo.cs +++ b/src/Java.Interop/Java.Interop/JniMarshalInfo.cs @@ -7,7 +7,7 @@ namespace Java.Interop { using CreateMarshalCollectionHandler = Func; using CleanupMarshalCollectionHandler = Action; - public delegate object CreateValueFromJni (ref JniObjectReference reference, JniHandleOwnership transfer, Type targetType); + public delegate object CreateValueFromJni (ref JniObjectReference reference, JniObjectReferenceOptions transfer, Type targetType); public struct JniMarshalInfo { diff --git a/src/Java.Interop/Java.Interop/JniObjectReferenceOptions.cs b/src/Java.Interop/Java.Interop/JniObjectReferenceOptions.cs new file mode 100644 index 000000000..5b731e0a3 --- /dev/null +++ b/src/Java.Interop/Java.Interop/JniObjectReferenceOptions.cs @@ -0,0 +1,17 @@ +using System; + +namespace Java.Interop +{ + [Flags] + public enum JniObjectReferenceOptions + { + Invalid = 0, + CreateNewReference = 1 << 0, // DoNotTransfer + DisposeSourceReference = 1 << 1, // Transfer + + /* + Unregistered = 4, + */ + } +} + diff --git a/src/Java.Interop/Java.Interop/JniPeerInstanceMethods.cs b/src/Java.Interop/Java.Interop/JniPeerInstanceMethods.cs index f2cadece6..fb74de742 100644 --- a/src/Java.Interop/Java.Interop/JniPeerInstanceMethods.cs +++ b/src/Java.Interop/Java.Interop/JniPeerInstanceMethods.cs @@ -292,7 +292,7 @@ public void Cleanup (object value) { if (cleanup != null && obj != null) cleanup (obj, value); - JniEnvironment.References.Dispose (ref lref, JniHandleOwnership.Transfer); + JniEnvironment.References.Dispose (ref lref, JniObjectReferenceOptions.DisposeSourceReference); } } } diff --git a/src/Java.Interop/Java.Interop/JniType.cs b/src/Java.Interop/Java.Interop/JniType.cs index 9b7cbb4dc..2e93e4539 100644 --- a/src/Java.Interop/Java.Interop/JniType.cs +++ b/src/Java.Interop/Java.Interop/JniType.cs @@ -15,7 +15,7 @@ public static unsafe JniType DefineClass (string name, JniObjectReference loader { fixed (byte* buf = classFileData) { var lref = JniEnvironment.Types.DefineClass (name, loader, (IntPtr) buf, classFileData.Length); - return new JniType (ref lref, JniHandleOwnership.Transfer); + return new JniType (ref lref, JniObjectReferenceOptions.DisposeSourceReference); } } @@ -29,15 +29,15 @@ public JniObjectReference PeerReference { public JniType (string classname) { var peer = JniEnvironment.Types.FindClass (classname); - Initialize (ref peer, JniHandleOwnership.Transfer); + Initialize (ref peer, JniObjectReferenceOptions.DisposeSourceReference); } - public JniType (ref JniObjectReference handle, JniHandleOwnership transfer) + public JniType (ref JniObjectReference handle, JniObjectReferenceOptions transfer) { Initialize (ref handle, transfer); } - void Initialize (ref JniObjectReference handle, JniHandleOwnership transfer) + void Initialize (ref JniObjectReference handle, JniObjectReferenceOptions transfer) { if (handle.Handle == IntPtr.Zero) throw new ArgumentException ("handle must be valid.", nameof (handle)); @@ -67,7 +67,7 @@ public void RegisterWithVM () if (peer.Type != JniObjectReferenceType.Global) { var o = peer; peer = o.NewGlobalRef (); - JniEnvironment.References.Dispose (ref o, JniHandleOwnership.Transfer); + JniEnvironment.References.Dispose (ref o, JniObjectReferenceOptions.DisposeSourceReference); } JniEnvironment.Current.JavaVM.Track (this); registered = true; @@ -108,7 +108,7 @@ public JniType GetSuperclass () var lref = JniEnvironment.Types.GetSuperclass (PeerReference); if (lref.IsValid) - return new JniType (ref lref, JniHandleOwnership.Transfer); + return new JniType (ref lref, JniObjectReferenceOptions.DisposeSourceReference); return null; } diff --git a/src/Java.Interop/Tests/Java.Interop/CallVirtualFromConstructorBase.cs b/src/Java.Interop/Tests/Java.Interop/CallVirtualFromConstructorBase.cs index edd6a4724..8f8be59fe 100644 --- a/src/Java.Interop/Tests/Java.Interop/CallVirtualFromConstructorBase.cs +++ b/src/Java.Interop/Tests/Java.Interop/CallVirtualFromConstructorBase.cs @@ -16,12 +16,12 @@ public override JniPeerMembers JniPeerMembers { } public unsafe CallVirtualFromConstructorBase (int value) - : base (ref *InvalidJniObjectReference, JniHandleOwnership.Invalid) + : base (ref *InvalidJniObjectReference, JniObjectReferenceOptions.Invalid) { var peer = JniPeerMembers.InstanceMethods.StartGenericCreateInstance ("(I)V", GetType (), value); using (SetPeerReference ( ref peer, - JniHandleOwnership.Transfer)) { + JniObjectReferenceOptions.DisposeSourceReference)) { JniPeerMembers.InstanceMethods.FinishGenericCreateInstance ("(I)V", this, value); } } diff --git a/src/Java.Interop/Tests/Java.Interop/JavaExceptionTests.cs b/src/Java.Interop/Tests/Java.Interop/JavaExceptionTests.cs index 4346f4c25..4c741d938 100644 --- a/src/Java.Interop/Tests/Java.Interop/JavaExceptionTests.cs +++ b/src/Java.Interop/Tests/Java.Interop/JavaExceptionTests.cs @@ -33,7 +33,7 @@ public void InnerException () using (var t = new JniType ("java/lang/Throwable")) { var outer = CreateThrowable (t, "Outer Exception"); SetThrowableCause (t, outer, "Inner Exception"); - using (var e = new JavaException (ref outer, JniHandleOwnership.Transfer)) { + using (var e = new JavaException (ref outer, JniObjectReferenceOptions.DisposeSourceReference)) { Assert.IsNotNull (e.InnerException); Assert.AreEqual ("Inner Exception", e.InnerException.Message); Assert.AreEqual ("Outer Exception", e.Message); @@ -79,7 +79,7 @@ public void InnerExceptionIsNotAProxy () var ex = new InvalidOperationException ("Managed Exception!"); var exp = CreateJavaProxyThrowable (ex); SetThrowableCause (t, outer, exp.PeerReference); - using (var e = new JavaException (ref outer, JniHandleOwnership.Transfer)) { + using (var e = new JavaException (ref outer, JniObjectReferenceOptions.DisposeSourceReference)) { Assert.IsNotNull (e.InnerException); Assert.AreSame (ex, e.InnerException); } diff --git a/src/Java.Interop/Tests/Java.Interop/JavaObjectTest.cs b/src/Java.Interop/Tests/Java.Interop/JavaObjectTest.cs index 38a042ead..3610cf80f 100644 --- a/src/Java.Interop/Tests/Java.Interop/JavaObjectTest.cs +++ b/src/Java.Interop/Tests/Java.Interop/JavaObjectTest.cs @@ -33,7 +33,7 @@ public void JavaReferencedInstanceSurvivesCollection () var first = array [0]; Assert.IsNotNull (JavaVM.Current.PeekObject (first.PeerReference)); var f = first.PeerReference; - var o = (JavaObject) JavaVM.Current.GetObject (ref f, JniHandleOwnership.DoNotTransfer); + var o = (JavaObject) JavaVM.Current.GetObject (ref f, JniObjectReferenceOptions.CreateNewReference); if (oldHandle != o.PeerReference.Handle) { Console.WriteLine ("Yay, object handle changed; value survived a GC!"); } else { @@ -75,7 +75,7 @@ public void RegisterWithVM_ThrowsOnDuplicateEntry () using (var original = new JavaObject ()) { original.RegisterWithVM (); var p = original.PeerReference; - var alias = new JavaObject (ref p, JniHandleOwnership.DoNotTransfer); + var alias = new JavaObject (ref p, JniObjectReferenceOptions.CreateNewReference); Assert.Throws (() => alias.RegisterWithVM ()); alias.Dispose (); } @@ -156,11 +156,11 @@ public unsafe void Ctor () var c = t.GetConstructor ("()V"); var lref = t.NewObject (c, null); Assert.IsTrue (lref.IsValid); - using (var o = new JavaObject (ref lref, JniHandleOwnership.DoNotTransfer)) { + using (var o = new JavaObject (ref lref, JniObjectReferenceOptions.CreateNewReference)) { Assert.IsTrue (lref.IsValid); Assert.AreNotSame (lref, o.PeerReference); } - using (var o = new JavaObject (ref lref, JniHandleOwnership.Transfer)) { + using (var o = new JavaObject (ref lref, JniObjectReferenceOptions.DisposeSourceReference)) { Assert.IsFalse (lref.IsValid); Assert.AreNotSame (lref, o.PeerReference); } @@ -171,7 +171,7 @@ public unsafe void Ctor () public void Ctor_Exceptions () { var r = new JniObjectReference (); - Assert.Throws (() => new JavaObject (ref r, JniHandleOwnership.Transfer)); + Assert.Throws (() => new JavaObject (ref r, JniObjectReferenceOptions.DisposeSourceReference)); // Note: This may break if/when JavaVM provides "default" Assert.Throws (() => new JavaObjectWithNoJavaPeer ()); diff --git a/src/Java.Interop/Tests/Java.Interop/JavaVMTest.cs b/src/Java.Interop/Tests/Java.Interop/JavaVMTest.cs index 1687b0c33..430f1060a 100644 --- a/src/Java.Interop/Tests/Java.Interop/JavaVMTest.cs +++ b/src/Java.Interop/Tests/Java.Interop/JavaVMTest.cs @@ -69,7 +69,7 @@ public void GetObject_ReturnsAlias () // In this case, it returns an _alias_. // TODO: "most derived type" alias generation. (Not relevant here, but...) var p = local.PeerReference; - var alias = JavaVM.Current.GetObject (ref p, JniHandleOwnership.DoNotTransfer); + var alias = JavaVM.Current.GetObject (ref p, JniObjectReferenceOptions.CreateNewReference); Assert.AreNotSame (local, alias); alias.Dispose (); local.Dispose (); @@ -103,7 +103,7 @@ public void GetObject_ReturnsRegisteredInstance () public void GetObject_ReturnsNullWithInvalidSafeHandle () { var invalid = new JniObjectReference (); - Assert.IsNull (JavaVM.Current.GetObject (ref invalid, JniHandleOwnership.Transfer)); + Assert.IsNull (JavaVM.Current.GetObject (ref invalid, JniObjectReferenceOptions.DisposeSourceReference)); } [Test] @@ -112,7 +112,7 @@ public unsafe void GetObject_FindBestMatchType () using (var t = new JniType (TestType.JniTypeName)) { var c = t.GetConstructor ("()V"); var o = t.NewObject (c, null); - using (var w = JavaVM.Current.GetObject (ref o, JniHandleOwnership.Transfer)) { + using (var w = JavaVM.Current.GetObject (ref o, JniObjectReferenceOptions.DisposeSourceReference)) { Assert.AreEqual (typeof (TestType), w.GetType ()); } } @@ -292,7 +292,7 @@ static void AssertGetJniMarshalInfoForPrimitiveType (string type) var info = JavaVM.Current.GetJniMarshalInfoForType (typeof(T)); info.CreateJValue (default (T)); var lref = info.CreateLocalRef (default (T)); - Assert.AreEqual (default (T), info.GetValueFromJni (ref lref, JniHandleOwnership.DoNotTransfer, null)); + Assert.AreEqual (default (T), info.GetValueFromJni (ref lref, JniObjectReferenceOptions.CreateNewReference, null)); JniEnvironment.References.Dispose (ref lref); } diff --git a/src/Java.Interop/Tests/Java.Interop/JniTypeTest.cs b/src/Java.Interop/Tests/Java.Interop/JniTypeTest.cs index cd57f58cd..761e3f262 100644 --- a/src/Java.Interop/Tests/Java.Interop/JniTypeTest.cs +++ b/src/Java.Interop/Tests/Java.Interop/JniTypeTest.cs @@ -142,7 +142,7 @@ public unsafe void Name () try { Assert.AreEqual ("java/lang/Object", Object_class.Name); - using (var t = new JniType (ref Object_hashCode_rt, JniHandleOwnership.DoNotTransfer)) + using (var t = new JniType (ref Object_hashCode_rt, JniObjectReferenceOptions.CreateNewReference)) Assert.AreEqual ("I", t.Name); } finally { JniEnvironment.References.Dispose (ref hashCode_str); diff --git a/src/Java.Interop/Tests/Java.Interop/TestType.cs b/src/Java.Interop/Tests/Java.Interop/TestType.cs index c3674e302..4b88f2202 100644 --- a/src/Java.Interop/Tests/Java.Interop/TestType.cs +++ b/src/Java.Interop/Tests/Java.Interop/TestType.cs @@ -33,7 +33,7 @@ public TestType () { } - public TestType (ref JniObjectReference reference, JniHandleOwnership transfer) + public TestType (ref JniObjectReference reference, JniObjectReferenceOptions transfer) : base (ref reference, transfer) { } diff --git a/tests/PerformanceTests/JavaTiming.cs b/tests/PerformanceTests/JavaTiming.cs index 9b9534985..97ad270f5 100644 --- a/tests/PerformanceTests/JavaTiming.cs +++ b/tests/PerformanceTests/JavaTiming.cs @@ -26,10 +26,10 @@ static unsafe JniObjectReference _NewObject () } public unsafe JavaTiming () - : base (ref *InvalidJniObjectReference, JniHandleOwnership.Invalid) + : base (ref *InvalidJniObjectReference, JniObjectReferenceOptions.Invalid) { var peer = _NewObject (); - using (SetPeerReference (ref peer, JniHandleOwnership.Transfer)) { + using (SetPeerReference (ref peer, JniObjectReferenceOptions.DisposeSourceReference)) { } } @@ -52,7 +52,7 @@ public static IJavaPeerable StaticObjectMethod () { TypeRef.GetCachedStaticMethod (ref som, "StaticObjectMethod", "()Ljava/lang/Object;"); var lref = som.CallObjectMethod (TypeRef.PeerReference); - return JniEnvironment.Current.JavaVM.GetObject (ref lref, JniHandleOwnership.Transfer); + return JniEnvironment.Current.JavaVM.GetObject (ref lref, JniObjectReferenceOptions.DisposeSourceReference); } static JniInstanceMethodInfo vvm; @@ -74,7 +74,7 @@ public virtual IJavaPeerable VirtualObjectMethod () { TypeRef.GetCachedInstanceMethod (ref vom, "VirtualObjectMethod", "()Ljava/lang/Object;"); var lref = vom.CallVirtualObjectMethod (PeerReference); - return JniEnvironment.Current.JavaVM.GetObject (ref lref, JniHandleOwnership.Transfer); + return JniEnvironment.Current.JavaVM.GetObject (ref lref, JniObjectReferenceOptions.DisposeSourceReference); } static JniInstanceMethodInfo fvm; @@ -96,7 +96,7 @@ public IJavaPeerable FinalObjectMethod () { TypeRef.GetCachedInstanceMethod (ref fom, "FinalObjectMethod", "()Ljava/lang/Object;"); var lref = vom.CallNonvirtualObjectMethod (PeerReference, TypeRef.PeerReference); - return JniEnvironment.Current.JavaVM.GetObject (ref lref, JniHandleOwnership.Transfer); + return JniEnvironment.Current.JavaVM.GetObject (ref lref, JniObjectReferenceOptions.DisposeSourceReference); } static JniInstanceMethodInfo vim1; diff --git a/tests/PerformanceTests/TimingTests.cs b/tests/PerformanceTests/TimingTests.cs index f43a38c68..3b6f504c0 100644 --- a/tests/PerformanceTests/TimingTests.cs +++ b/tests/PerformanceTests/TimingTests.cs @@ -83,7 +83,7 @@ public unsafe void MethodInvocationTiming () var Object_class = new JniType ("java/lang/Object"); var Object_init = Object_class.GetConstructor ("()V"); - var transfer = JniHandleOwnership.Transfer; + var transfer = JniObjectReferenceOptions.DisposeSourceReference; var jobj1 = CreateJavaObject (Object_class.NewObject (Object_init, null), transfer); var jobj2 = CreateJavaObject (Object_class.NewObject (Object_init, null), transfer); @@ -280,7 +280,7 @@ public unsafe void MethodInvocationTiming () Console.WriteLine ("## {0} Timing: {1}", nameof (MethodInvocationTiming), total.Elapsed); } - static JavaObject CreateJavaObject (JniObjectReference value, JniHandleOwnership transfer) + static JavaObject CreateJavaObject (JniObjectReference value, JniObjectReferenceOptions transfer) { return new JavaObject (ref value, transfer); } @@ -434,7 +434,7 @@ public void ObjectArrayEnumerationTiming () Console.WriteLine ("# {0}: java.util.Arrays.class.getMethods() Timing: {1}", nameof (ObjectArrayEnumerationTiming), total.Elapsed); var methodsTiming = Stopwatch.StartNew (); - using (var methods = new JavaObjectArray (ref lrefMethods, JniHandleOwnership.DoNotTransfer)) { + using (var methods = new JavaObjectArray (ref lrefMethods, JniObjectReferenceOptions.CreateNewReference)) { foreach (var method in methods) { methodHandles.Add (method); } @@ -448,7 +448,7 @@ public void ObjectArrayEnumerationTiming () int len = JniEnvironment.Arrays.GetArrayLength (lrefMethods); for (int i = 0; i < len; ++i) { var v = JniEnvironment.Arrays.GetObjectArrayElement (lrefMethods, i); - methodHandlesGO.Add (vm.GetObject (ref v, JniHandleOwnership.Transfer)); + methodHandlesGO.Add (vm.GetObject (ref v, JniObjectReferenceOptions.DisposeSourceReference)); } methodsTiming.Stop (); Console.WriteLine ("# methodHandles(JavaVM.GetObject) creation timing: {0} Count={1}", methodsTiming.Elapsed, methodHandles.Count); @@ -461,7 +461,7 @@ public void ObjectArrayEnumerationTiming () len = JniEnvironment.Arrays.GetArrayLength (lrefMethods); for (int i = 0; i < len; ++i) { var v = JniEnvironment.Arrays.GetObjectArrayElement (lrefMethods, i); - methodHandlesAr.Add (new JavaObject (ref v, JniHandleOwnership.Transfer)); + methodHandlesAr.Add (new JavaObject (ref v, JniObjectReferenceOptions.DisposeSourceReference)); } methodsTiming.Stop (); Console.WriteLine ("# methodHandles(JavaObject[]) creation timing: {0} Count={1}", methodsTiming.Elapsed, methodHandles.Count); @@ -494,19 +494,19 @@ public void ObjectArrayEnumerationTiming () foreach (var method in methodHandles) { var lookupTiming = Stopwatch.StartNew (); var n_name = Method_getName.CallVirtualObjectMethod (method.PeerReference); - var name = JniEnvironment.Strings.ToString (ref n_name, JniHandleOwnership.Transfer); + var name = JniEnvironment.Strings.ToString (ref n_name, JniObjectReferenceOptions.DisposeSourceReference); var n_rt = Method_getReturnType.CallVirtualObjectMethod (method.PeerReference); - using (var rt = new JniType (ref n_rt, JniHandleOwnership.Transfer)) { + using (var rt = new JniType (ref n_rt, JniObjectReferenceOptions.DisposeSourceReference)) { } var parameterTiming = Stopwatch.StartNew (); var enumTime = new TimeSpan (); var lrefPs = Method_getParameterTypes.CallVirtualObjectMethod (method.PeerReference); Stopwatch cleanup; - using (var ps = new JavaObjectArray(ref lrefPs, JniHandleOwnership.Transfer)) { + using (var ps = new JavaObjectArray(ref lrefPs, JniObjectReferenceOptions.DisposeSourceReference)) { var enumSw = Stopwatch.StartNew (); foreach (var p in ps) { var h = p.PeerReference; - using (var pt = new JniType (ref h, JniHandleOwnership.DoNotTransfer)) { + using (var pt = new JniType (ref h, JniObjectReferenceOptions.CreateNewReference)) { } } enumSw.Stop (); @@ -627,7 +627,7 @@ public unsafe void ObjectCreationTiming () getObjectTime = Stopwatch.StartNew (); for (int i = 0; i < C; ++i) { var h = JniEnvironment.Arrays.GetObjectArrayElement (strings.PeerReference, i); - var o = vm.GetObject (ref h, JniHandleOwnership.Transfer); + var o = vm.GetObject (ref h, JniObjectReferenceOptions.DisposeSourceReference); rlist.Add (o); } getObjectTime.Stop ();