diff --git a/src/Mono.Android/Android.Runtime/JNIEnv.cs b/src/Mono.Android/Android.Runtime/JNIEnv.cs index 4a6e9a468dd..d214cf9576b 100644 --- a/src/Mono.Android/Android.Runtime/JNIEnv.cs +++ b/src/Mono.Android/Android.Runtime/JNIEnv.cs @@ -346,7 +346,7 @@ public static void EnsureLocalCapacity (int capacity) internal static void DeleteRef (IntPtr handle, JniHandleOwnership transfer) { - switch (transfer) { + switch (transfer & (JniHandleOwnership.TransferLocalRef | JniHandleOwnership.TransferGlobalRef)) { case JniHandleOwnership.DoNotTransfer: break; case JniHandleOwnership.TransferLocalRef: diff --git a/tests/Mono.Android-Tests/Mono.Android-Tests/Java.Interop/JavaConvertTest.cs b/tests/Mono.Android-Tests/Mono.Android-Tests/Java.Interop/JavaConvertTest.cs index f59d79b9aa6..79e72d03458 100644 --- a/tests/Mono.Android-Tests/Mono.Android-Tests/Java.Interop/JavaConvertTest.cs +++ b/tests/Mono.Android-Tests/Mono.Android-Tests/Java.Interop/JavaConvertTest.cs @@ -114,6 +114,20 @@ public void NullStringMarshalsAsIntPtrZero () Assert.AreEqual (null, list [0]); } + [Test] + public void DeleteLocalRefWithDoNotRegister () + { + int initialLocalReferenceCount = Java.Interop.Runtime.LocalReferenceCount; + + using (var value = new Java.Lang.String ( + JNIEnv.NewString ("value"), + JniHandleOwnership.TransferLocalRef | JniHandleOwnership.DoNotRegister)) { + Assert.AreEqual ("value", value.ToString ()); + } + + Assert.AreEqual (initialLocalReferenceCount, Java.Interop.Runtime.LocalReferenceCount); + } + [Test] public void MarshalInt23Array () {