From 143a0f7eef0bf8ed19973ece9fcced151933deb5 Mon Sep 17 00:00:00 2001 From: Jonathan Pobst Date: Fri, 18 Sep 2020 09:24:10 -0500 Subject: [PATCH 1/3] [generator] Use GC.KeepAlive for reference type method parameters. --- .../JavaInterop1/WriteClass.txt | 2 ++ .../JavaInterop1/WriteClassMethods.txt | 1 + .../JavaInterop1/WriteClassProperties.txt | 1 + ...iteKotlinUnsignedArrayTypeMethodsClass.txt | 4 +++ ...KotlinUnsignedArrayTypePropertiesClass.txt | 4 +++ ...WriteKotlinUnsignedTypePropertiesClass.txt | 1 + .../XAJavaInterop1-NRT/WriteClass.txt | 2 ++ .../XAJavaInterop1-NRT/WriteClassMethods.txt | 1 + .../WriteClassProperties.txt | 1 + .../XAJavaInterop1/WriteClass.txt | 2 ++ .../XAJavaInterop1/WriteClassMethods.txt | 1 + .../XAJavaInterop1/WriteClassProperties.txt | 1 + .../Adapters/Xamarin.Test.AbsSpinner.cs | 2 ++ .../Adapters/Xamarin.Test.AdapterView.cs | 1 + .../Xamarin.Test.CSharpKeywords.cs | 1 + .../Android.Text.SpannableString.cs | 1 + .../Android.Text.SpannableStringInternal.cs | 1 + .../Core_Jar2Xml/Android.Views.View.cs | 3 +++ ...Android.Exoplayer.Drm.FrameworkMediaDrm.cs | 1 + .../NormalMethods/Xamarin.Test.SomeObject.cs | 5 ++++ .../Xamarin.Test.SomeObject.cs | 2 ++ .../ParameterXPath/Xamarin.Test.A.cs | 2 ++ .../Xamarin.Test.SomeObject.cs | 2 ++ .../Streams/Java.IO.InputStream.cs | 2 ++ .../Streams/Java.IO.OutputStream.cs | 2 ++ .../Test.ME.GenericImplementation.cs | 1 + ....ME.GenericObjectPropertyImplementation.cs | 1 + .../Test.ME.GenericStringImplementation.cs | 1 + ....ME.GenericStringPropertyImplementation.cs | 1 + .../Test.ME.TestInterfaceImplementation.cs | 3 +++ .../java.lang.Enum/Java.Lang.Enum.cs | 1 + .../JavaInteropCodeGenerator.cs | 27 +++++++++++++++++++ 32 files changed, 81 insertions(+) diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClass.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClass.txt index 972dc529c..5b5461a72 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClass.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClass.txt @@ -162,6 +162,7 @@ public partial class MyClass { _members.InstanceMethods.InvokeVirtualVoidMethod (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_value); + global::System.GC.KeepAlive (value); } } } @@ -260,6 +261,7 @@ public partial class MyClass { return __rm; } finally { JNIEnv.DeleteLocalRef (native_key); + global::System.GC.KeepAlive (key); } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClassMethods.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClassMethods.txt index f054a3b81..35df3241e 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClassMethods.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClassMethods.txt @@ -29,6 +29,7 @@ public virtual unsafe int GetCountForKey (string key) return __rm; } finally { JNIEnv.DeleteLocalRef (native_key); + global::System.GC.KeepAlive (key); } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClassProperties.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClassProperties.txt index 6801b7f39..ba84ba470 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClassProperties.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClassProperties.txt @@ -109,6 +109,7 @@ public virtual unsafe string Key { _members.InstanceMethods.InvokeVirtualVoidMethod (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_value); + global::System.GC.KeepAlive (value); } } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteKotlinUnsignedArrayTypeMethodsClass.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteKotlinUnsignedArrayTypeMethodsClass.txt index 6dc50ca2f..089260b54 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteKotlinUnsignedArrayTypeMethodsClass.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteKotlinUnsignedArrayTypeMethodsClass.txt @@ -27,6 +27,7 @@ public partial class MyClass { JNIEnv.CopyArray (native_value, value); JNIEnv.DeleteLocalRef (native_value); } + global::System.GC.KeepAlive (value); } } @@ -46,6 +47,7 @@ public partial class MyClass { JNIEnv.CopyArray (native_value, value); JNIEnv.DeleteLocalRef (native_value); } + global::System.GC.KeepAlive (value); } } @@ -65,6 +67,7 @@ public partial class MyClass { JNIEnv.CopyArray (native_value, value); JNIEnv.DeleteLocalRef (native_value); } + global::System.GC.KeepAlive (value); } } @@ -84,6 +87,7 @@ public partial class MyClass { JNIEnv.CopyArray (native_value, value); JNIEnv.DeleteLocalRef (native_value); } + global::System.GC.KeepAlive (value); } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteKotlinUnsignedArrayTypePropertiesClass.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteKotlinUnsignedArrayTypePropertiesClass.txt index 3f2241de6..e500b02aa 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteKotlinUnsignedArrayTypePropertiesClass.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteKotlinUnsignedArrayTypePropertiesClass.txt @@ -36,6 +36,7 @@ public partial class MyClass { JNIEnv.CopyArray (native_value, value); JNIEnv.DeleteLocalRef (native_value); } + global::System.GC.KeepAlive (value); } } } @@ -65,6 +66,7 @@ public partial class MyClass { JNIEnv.CopyArray (native_value, value); JNIEnv.DeleteLocalRef (native_value); } + global::System.GC.KeepAlive (value); } } } @@ -94,6 +96,7 @@ public partial class MyClass { JNIEnv.CopyArray (native_value, value); JNIEnv.DeleteLocalRef (native_value); } + global::System.GC.KeepAlive (value); } } } @@ -123,6 +126,7 @@ public partial class MyClass { JNIEnv.CopyArray (native_value, value); JNIEnv.DeleteLocalRef (native_value); } + global::System.GC.KeepAlive (value); } } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteKotlinUnsignedTypePropertiesClass.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteKotlinUnsignedTypePropertiesClass.txt index f7fb28ed9..748a79c32 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteKotlinUnsignedTypePropertiesClass.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteKotlinUnsignedTypePropertiesClass.txt @@ -103,6 +103,7 @@ public partial class MyClass { __args [0] = new JniArgumentValue (value); _members.InstanceMethods.InvokeAbstractVoidMethod (__id, this, __args); } finally { + global::System.GC.KeepAlive (value); } } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClass.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClass.txt index 820ebdd66..6ce47114b 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClass.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClass.txt @@ -162,6 +162,7 @@ public partial class MyClass { _members.InstanceMethods.InvokeVirtualVoidMethod (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_value); + global::System.GC.KeepAlive (value); } } } @@ -260,6 +261,7 @@ public partial class MyClass { return __rm; } finally { JNIEnv.DeleteLocalRef (native_key); + global::System.GC.KeepAlive (key); } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClassMethods.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClassMethods.txt index e5240d219..9a6630743 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClassMethods.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClassMethods.txt @@ -29,6 +29,7 @@ public virtual unsafe int GetCountForKey (string? key) return __rm; } finally { JNIEnv.DeleteLocalRef (native_key); + global::System.GC.KeepAlive (key); } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClassProperties.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClassProperties.txt index e7efea768..a5bf26a6c 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClassProperties.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClassProperties.txt @@ -109,6 +109,7 @@ public virtual unsafe string? Key { _members.InstanceMethods.InvokeVirtualVoidMethod (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_value); + global::System.GC.KeepAlive (value); } } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClass.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClass.txt index b8851c8ec..34847361d 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClass.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClass.txt @@ -162,6 +162,7 @@ public partial class MyClass { _members.InstanceMethods.InvokeVirtualVoidMethod (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_value); + global::System.GC.KeepAlive (value); } } } @@ -260,6 +261,7 @@ public partial class MyClass { return __rm; } finally { JNIEnv.DeleteLocalRef (native_key); + global::System.GC.KeepAlive (key); } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClassMethods.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClassMethods.txt index f054a3b81..35df3241e 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClassMethods.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClassMethods.txt @@ -29,6 +29,7 @@ public virtual unsafe int GetCountForKey (string key) return __rm; } finally { JNIEnv.DeleteLocalRef (native_key); + global::System.GC.KeepAlive (key); } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClassProperties.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClassProperties.txt index 6801b7f39..ba84ba470 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClassProperties.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClassProperties.txt @@ -109,6 +109,7 @@ public virtual unsafe string Key { _members.InstanceMethods.InvokeVirtualVoidMethod (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_value); + global::System.GC.KeepAlive (value); } } } diff --git a/tests/generator-Tests/expected.ji/Adapters/Xamarin.Test.AbsSpinner.cs b/tests/generator-Tests/expected.ji/Adapters/Xamarin.Test.AbsSpinner.cs index 9af7c4cee..f74802047 100644 --- a/tests/generator-Tests/expected.ji/Adapters/Xamarin.Test.AbsSpinner.cs +++ b/tests/generator-Tests/expected.ji/Adapters/Xamarin.Test.AbsSpinner.cs @@ -83,6 +83,7 @@ static void n_SetAdapter_Lxamarin_test_SpinnerAdapter_ (IntPtr jnienv, IntPtr na __args [0] = new JniArgumentValue ((value == null) ? IntPtr.Zero : ((global::Java.Lang.Object) value).Handle); _members.InstanceMethods.InvokeVirtualVoidMethod (__id, this, __args); } finally { + global::System.GC.KeepAlive (value); } } } @@ -126,6 +127,7 @@ public AbsSpinnerInvoker (IntPtr handle, JniHandleOwnership transfer) : base (ha _members.InstanceMethods.InvokeAbstractVoidMethod (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_value); + global::System.GC.KeepAlive (value); } } } diff --git a/tests/generator-Tests/expected.ji/Adapters/Xamarin.Test.AdapterView.cs b/tests/generator-Tests/expected.ji/Adapters/Xamarin.Test.AdapterView.cs index 0377b29fd..f1fcacb6d 100644 --- a/tests/generator-Tests/expected.ji/Adapters/Xamarin.Test.AdapterView.cs +++ b/tests/generator-Tests/expected.ji/Adapters/Xamarin.Test.AdapterView.cs @@ -110,6 +110,7 @@ public AdapterViewInvoker (IntPtr handle, JniHandleOwnership transfer) : base (h _members.InstanceMethods.InvokeAbstractVoidMethod (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_value); + global::System.GC.KeepAlive (value); } } } diff --git a/tests/generator-Tests/expected.ji/CSharpKeywords/Xamarin.Test.CSharpKeywords.cs b/tests/generator-Tests/expected.ji/CSharpKeywords/Xamarin.Test.CSharpKeywords.cs index f0c4c2d50..21c23c88b 100644 --- a/tests/generator-Tests/expected.ji/CSharpKeywords/Xamarin.Test.CSharpKeywords.cs +++ b/tests/generator-Tests/expected.ji/CSharpKeywords/Xamarin.Test.CSharpKeywords.cs @@ -73,6 +73,7 @@ public static unsafe string UseThis (string this_) return JNIEnv.GetString (__rm.Handle, JniHandleOwnership.TransferLocalRef); } finally { JNIEnv.DeleteLocalRef (native_this); + global::System.GC.KeepAlive (this_); } } diff --git a/tests/generator-Tests/expected.ji/Core_Jar2Xml/Android.Text.SpannableString.cs b/tests/generator-Tests/expected.ji/Core_Jar2Xml/Android.Text.SpannableString.cs index 2f96f1fe1..c2eec734b 100644 --- a/tests/generator-Tests/expected.ji/Core_Jar2Xml/Android.Text.SpannableString.cs +++ b/tests/generator-Tests/expected.ji/Core_Jar2Xml/Android.Text.SpannableString.cs @@ -102,6 +102,7 @@ static int n_GetSpanFlags_Ljava_lang_Object_ (IntPtr jnienv, IntPtr native__this var __rm = _members.InstanceMethods.InvokeVirtualInt32Method (__id, this, __args); return (global::Android.Text.SpanTypes) __rm; } finally { + global::System.GC.KeepAlive (what); } } diff --git a/tests/generator-Tests/expected.ji/Core_Jar2Xml/Android.Text.SpannableStringInternal.cs b/tests/generator-Tests/expected.ji/Core_Jar2Xml/Android.Text.SpannableStringInternal.cs index d1fd6eb38..5de9ca791 100644 --- a/tests/generator-Tests/expected.ji/Core_Jar2Xml/Android.Text.SpannableStringInternal.cs +++ b/tests/generator-Tests/expected.ji/Core_Jar2Xml/Android.Text.SpannableStringInternal.cs @@ -60,6 +60,7 @@ static int n_GetSpanFlags_Ljava_lang_Object_ (IntPtr jnienv, IntPtr native__this var __rm = _members.InstanceMethods.InvokeVirtualInt32Method (__id, this, __args); return (global::Android.Text.SpanTypes) __rm; } finally { + global::System.GC.KeepAlive (p0); } } diff --git a/tests/generator-Tests/expected.ji/Core_Jar2Xml/Android.Views.View.cs b/tests/generator-Tests/expected.ji/Core_Jar2Xml/Android.Views.View.cs index 5ac088ea9..0be44ac2c 100644 --- a/tests/generator-Tests/expected.ji/Core_Jar2Xml/Android.Views.View.cs +++ b/tests/generator-Tests/expected.ji/Core_Jar2Xml/Android.Views.View.cs @@ -176,6 +176,7 @@ public virtual unsafe void SetOnClickListener (global::Android.Views.View.IOnCli __args [0] = new JniArgumentValue ((l == null) ? IntPtr.Zero : ((global::Java.Lang.Object) l).Handle); _members.InstanceMethods.InvokeVirtualVoidMethod (__id, this, __args); } finally { + global::System.GC.KeepAlive (l); } } @@ -206,6 +207,7 @@ public virtual unsafe void SetOn123Listener (global::Android.Views.View.IOnClick __args [0] = new JniArgumentValue ((l == null) ? IntPtr.Zero : ((global::Java.Lang.Object) l).Handle); _members.InstanceMethods.InvokeVirtualVoidMethod (__id, this, __args); } finally { + global::System.GC.KeepAlive (l); } } @@ -238,6 +240,7 @@ public virtual unsafe void AddTouchables (global::System.Collections.Generic.ILi _members.InstanceMethods.InvokeVirtualVoidMethod (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_views); + global::System.GC.KeepAlive (views); } } diff --git a/tests/generator-Tests/expected.ji/GenericArguments/Com.Google.Android.Exoplayer.Drm.FrameworkMediaDrm.cs b/tests/generator-Tests/expected.ji/GenericArguments/Com.Google.Android.Exoplayer.Drm.FrameworkMediaDrm.cs index c0ddc30eb..7ebb23b86 100644 --- a/tests/generator-Tests/expected.ji/GenericArguments/Com.Google.Android.Exoplayer.Drm.FrameworkMediaDrm.cs +++ b/tests/generator-Tests/expected.ji/GenericArguments/Com.Google.Android.Exoplayer.Drm.FrameworkMediaDrm.cs @@ -58,6 +58,7 @@ public unsafe void SetOnEventListener (global::Com.Google.Android.Exoplayer.Drm. __args [0] = new JniArgumentValue ((p0 == null) ? IntPtr.Zero : ((global::Java.Lang.Object) p0).Handle); _members.InstanceMethods.InvokeAbstractVoidMethod (__id, this, __args); } finally { + global::System.GC.KeepAlive (p0); } } diff --git a/tests/generator-Tests/expected.ji/NormalMethods/Xamarin.Test.SomeObject.cs b/tests/generator-Tests/expected.ji/NormalMethods/Xamarin.Test.SomeObject.cs index 19cca3989..37eb731af 100644 --- a/tests/generator-Tests/expected.ji/NormalMethods/Xamarin.Test.SomeObject.cs +++ b/tests/generator-Tests/expected.ji/NormalMethods/Xamarin.Test.SomeObject.cs @@ -109,6 +109,8 @@ static int n_Handle_Ljava_lang_Object_Ljava_lang_Throwable_ (IntPtr jnienv, IntP var __rm = _members.InstanceMethods.InvokeVirtualInt32Method (__id, this, __args); return __rm; } finally { + global::System.GC.KeepAlive (o); + global::System.GC.KeepAlive (t); } } @@ -255,6 +257,8 @@ public virtual unsafe void VoidMethodWithParams (string astring, int anint, glob _members.InstanceMethods.InvokeVirtualVoidMethod (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_astring); + global::System.GC.KeepAlive (astring); + global::System.GC.KeepAlive (anObject); } } @@ -318,6 +322,7 @@ public virtual unsafe void ArrayListTest (global::System.Collections.Generic.ILi _members.InstanceMethods.InvokeVirtualVoidMethod (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_p0); + global::System.GC.KeepAlive (p0); } } diff --git a/tests/generator-Tests/expected.ji/NormalProperties/Xamarin.Test.SomeObject.cs b/tests/generator-Tests/expected.ji/NormalProperties/Xamarin.Test.SomeObject.cs index fea7ba757..097047d1f 100644 --- a/tests/generator-Tests/expected.ji/NormalProperties/Xamarin.Test.SomeObject.cs +++ b/tests/generator-Tests/expected.ji/NormalProperties/Xamarin.Test.SomeObject.cs @@ -210,6 +210,7 @@ public override unsafe int SomeInteger { __args [0] = new JniArgumentValue ((value == null) ? IntPtr.Zero : ((global::Java.Lang.Object) value).Handle); _members.InstanceMethods.InvokeAbstractVoidMethod (__id, this, __args); } finally { + global::System.GC.KeepAlive (value); } } } @@ -236,6 +237,7 @@ public override unsafe string SomeString { _members.InstanceMethods.InvokeAbstractVoidMethod (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_value); + global::System.GC.KeepAlive (value); } } } diff --git a/tests/generator-Tests/expected.ji/ParameterXPath/Xamarin.Test.A.cs b/tests/generator-Tests/expected.ji/ParameterXPath/Xamarin.Test.A.cs index 61c229d49..7d0387df5 100644 --- a/tests/generator-Tests/expected.ji/ParameterXPath/Xamarin.Test.A.cs +++ b/tests/generator-Tests/expected.ji/ParameterXPath/Xamarin.Test.A.cs @@ -60,6 +60,7 @@ public virtual unsafe void SetA (global::Java.Lang.Object adapter) _members.InstanceMethods.InvokeVirtualVoidMethod (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_adapter); + global::System.GC.KeepAlive (adapter); } } @@ -92,6 +93,7 @@ public virtual unsafe void ListTest (global::System.Collections.Generic.IList (__rm.Handle, JniHandleOwnership.TransferLocalRef); } finally { JNIEnv.DeleteLocalRef (native_value); + global::System.GC.KeepAlive (value); } } diff --git a/tests/generator-Tests/expected.ji/java.lang.Enum/Java.Lang.Enum.cs b/tests/generator-Tests/expected.ji/java.lang.Enum/Java.Lang.Enum.cs index 648ab525b..93587873d 100644 --- a/tests/generator-Tests/expected.ji/java.lang.Enum/Java.Lang.Enum.cs +++ b/tests/generator-Tests/expected.ji/java.lang.Enum/Java.Lang.Enum.cs @@ -44,6 +44,7 @@ public unsafe int CompareTo (global::Java.Lang.Object o) return __rm; } finally { JNIEnv.DeleteLocalRef (native_o); + global::System.GC.KeepAlive (o); } } diff --git a/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/JavaInteropCodeGenerator.cs b/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/JavaInteropCodeGenerator.cs index 52d2788ae..ed8f068b2 100644 --- a/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/JavaInteropCodeGenerator.cs +++ b/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/JavaInteropCodeGenerator.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Linq; using Mono.Options; namespace MonoDroid.Generation { @@ -182,9 +183,35 @@ internal override void WriteMethodBody (Method method, string indent, GenBase ty writer.WriteLine ("{0}}} finally {{", indent); foreach (string cleanup in method.Parameters.GetCallCleanup (opt)) writer.WriteLine ("{0}\t{1}", indent, cleanup); + foreach (var p in method.Parameters.Where (GenerateKeepAlive)) + writer.WriteLine ($"{indent}\tglobal::System.GC.KeepAlive ({opt.GetSafeIdentifier (p.Name)});"); + writer.WriteLine ("{0}}}", indent); } + bool GenerateKeepAlive (Parameter p) + { + if (p.Symbol.IsEnum) + return false; + + return p.Type switch { + "bool" => false, + "sbyte" => false, + "char" => false, + "double" => false, + "float" => false, + "int" => false, + "long" => false, + "short" => false, + "uint" => false, + "ushort" => false, + "ulong" => false, + "byte" => false, + "Android.Graphics.Color" => false, + _ => true + }; + } + internal override void WriteFieldIdField (Field field, string indent) { // No field id_ field required From bb1abc2f52bd63c9c7eae2cf15bffe86f36a5e7e Mon Sep 17 00:00:00 2001 From: Jonathan Pobst Date: Fri, 18 Sep 2020 12:10:45 -0500 Subject: [PATCH 2/3] Exclude string and ubyte. --- .../CodeGeneratorExpectedResults/JavaInterop1/WriteClass.txt | 1 - .../JavaInterop1/WriteClassMethods.txt | 1 - .../JavaInterop1/WriteKotlinUnsignedTypePropertiesClass.txt | 1 - .../XAJavaInterop1-NRT/WriteClass.txt | 1 - .../XAJavaInterop1-NRT/WriteClassMethods.txt | 1 - .../CodeGeneratorExpectedResults/XAJavaInterop1/WriteClass.txt | 1 - .../XAJavaInterop1/WriteClassMethods.txt | 1 - .../expected.ji/CSharpKeywords/Xamarin.Test.CSharpKeywords.cs | 1 - .../expected.ji/NormalMethods/Xamarin.Test.SomeObject.cs | 1 - .../expected.ji/NormalProperties/Xamarin.Test.SomeObject.cs | 1 - .../expected.ji/StaticProperties/Xamarin.Test.SomeObject.cs | 1 - .../Test.ME.GenericStringPropertyImplementation.cs | 1 - .../JavaInteropCodeGenerator.cs | 2 ++ 13 files changed, 2 insertions(+), 12 deletions(-) diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClass.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClass.txt index 5b5461a72..bd3507575 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClass.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClass.txt @@ -261,7 +261,6 @@ public partial class MyClass { return __rm; } finally { JNIEnv.DeleteLocalRef (native_key); - global::System.GC.KeepAlive (key); } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClassMethods.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClassMethods.txt index 35df3241e..f054a3b81 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClassMethods.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClassMethods.txt @@ -29,7 +29,6 @@ public virtual unsafe int GetCountForKey (string key) return __rm; } finally { JNIEnv.DeleteLocalRef (native_key); - global::System.GC.KeepAlive (key); } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteKotlinUnsignedTypePropertiesClass.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteKotlinUnsignedTypePropertiesClass.txt index 748a79c32..f7fb28ed9 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteKotlinUnsignedTypePropertiesClass.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteKotlinUnsignedTypePropertiesClass.txt @@ -103,7 +103,6 @@ public partial class MyClass { __args [0] = new JniArgumentValue (value); _members.InstanceMethods.InvokeAbstractVoidMethod (__id, this, __args); } finally { - global::System.GC.KeepAlive (value); } } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClass.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClass.txt index 6ce47114b..8eb09bdd7 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClass.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClass.txt @@ -261,7 +261,6 @@ public partial class MyClass { return __rm; } finally { JNIEnv.DeleteLocalRef (native_key); - global::System.GC.KeepAlive (key); } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClassMethods.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClassMethods.txt index 9a6630743..e5240d219 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClassMethods.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClassMethods.txt @@ -29,7 +29,6 @@ public virtual unsafe int GetCountForKey (string? key) return __rm; } finally { JNIEnv.DeleteLocalRef (native_key); - global::System.GC.KeepAlive (key); } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClass.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClass.txt index 34847361d..51eed1baf 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClass.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClass.txt @@ -261,7 +261,6 @@ public partial class MyClass { return __rm; } finally { JNIEnv.DeleteLocalRef (native_key); - global::System.GC.KeepAlive (key); } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClassMethods.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClassMethods.txt index 35df3241e..f054a3b81 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClassMethods.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClassMethods.txt @@ -29,7 +29,6 @@ public virtual unsafe int GetCountForKey (string key) return __rm; } finally { JNIEnv.DeleteLocalRef (native_key); - global::System.GC.KeepAlive (key); } } diff --git a/tests/generator-Tests/expected.ji/CSharpKeywords/Xamarin.Test.CSharpKeywords.cs b/tests/generator-Tests/expected.ji/CSharpKeywords/Xamarin.Test.CSharpKeywords.cs index 21c23c88b..f0c4c2d50 100644 --- a/tests/generator-Tests/expected.ji/CSharpKeywords/Xamarin.Test.CSharpKeywords.cs +++ b/tests/generator-Tests/expected.ji/CSharpKeywords/Xamarin.Test.CSharpKeywords.cs @@ -73,7 +73,6 @@ public static unsafe string UseThis (string this_) return JNIEnv.GetString (__rm.Handle, JniHandleOwnership.TransferLocalRef); } finally { JNIEnv.DeleteLocalRef (native_this); - global::System.GC.KeepAlive (this_); } } diff --git a/tests/generator-Tests/expected.ji/NormalMethods/Xamarin.Test.SomeObject.cs b/tests/generator-Tests/expected.ji/NormalMethods/Xamarin.Test.SomeObject.cs index 37eb731af..e84806ca8 100644 --- a/tests/generator-Tests/expected.ji/NormalMethods/Xamarin.Test.SomeObject.cs +++ b/tests/generator-Tests/expected.ji/NormalMethods/Xamarin.Test.SomeObject.cs @@ -257,7 +257,6 @@ public virtual unsafe void VoidMethodWithParams (string astring, int anint, glob _members.InstanceMethods.InvokeVirtualVoidMethod (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_astring); - global::System.GC.KeepAlive (astring); global::System.GC.KeepAlive (anObject); } } diff --git a/tests/generator-Tests/expected.ji/NormalProperties/Xamarin.Test.SomeObject.cs b/tests/generator-Tests/expected.ji/NormalProperties/Xamarin.Test.SomeObject.cs index 097047d1f..35e615255 100644 --- a/tests/generator-Tests/expected.ji/NormalProperties/Xamarin.Test.SomeObject.cs +++ b/tests/generator-Tests/expected.ji/NormalProperties/Xamarin.Test.SomeObject.cs @@ -237,7 +237,6 @@ public override unsafe string SomeString { _members.InstanceMethods.InvokeAbstractVoidMethod (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_value); - global::System.GC.KeepAlive (value); } } } diff --git a/tests/generator-Tests/expected.ji/StaticProperties/Xamarin.Test.SomeObject.cs b/tests/generator-Tests/expected.ji/StaticProperties/Xamarin.Test.SomeObject.cs index b3106d381..4010ce06d 100644 --- a/tests/generator-Tests/expected.ji/StaticProperties/Xamarin.Test.SomeObject.cs +++ b/tests/generator-Tests/expected.ji/StaticProperties/Xamarin.Test.SomeObject.cs @@ -76,7 +76,6 @@ public static unsafe string SomeString { _members.StaticMethods.InvokeVoidMethod (__id, __args); } finally { JNIEnv.DeleteLocalRef (native_value); - global::System.GC.KeepAlive (value); } } } diff --git a/tests/generator-Tests/expected.ji/TestInterface/Test.ME.GenericStringPropertyImplementation.cs b/tests/generator-Tests/expected.ji/TestInterface/Test.ME.GenericStringPropertyImplementation.cs index 86a05e954..89c09ba93 100644 --- a/tests/generator-Tests/expected.ji/TestInterface/Test.ME.GenericStringPropertyImplementation.cs +++ b/tests/generator-Tests/expected.ji/TestInterface/Test.ME.GenericStringPropertyImplementation.cs @@ -103,7 +103,6 @@ public virtual unsafe string Object { _members.InstanceMethods.InvokeVirtualVoidMethod (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_value); - global::System.GC.KeepAlive (value); } } } diff --git a/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/JavaInteropCodeGenerator.cs b/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/JavaInteropCodeGenerator.cs index ed8f068b2..5acf2b575 100644 --- a/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/JavaInteropCodeGenerator.cs +++ b/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/JavaInteropCodeGenerator.cs @@ -207,6 +207,8 @@ bool GenerateKeepAlive (Parameter p) "ushort" => false, "ulong" => false, "byte" => false, + "ubyte" => false, // Not a C# type, but we will see it from Kotlin unsigned types support + "string" => false, "Android.Graphics.Color" => false, _ => true }; From ed3ab4a6479fb4c641115478c6962a6e62f36381 Mon Sep 17 00:00:00 2001 From: Jonathan Pobst Date: Mon, 21 Sep 2020 10:41:36 -0500 Subject: [PATCH 3/3] Exclude java.lang.String, add logic to constructors. --- .../CodeGeneratorExpectedResults/JavaInterop1/WriteClass.txt | 1 - .../JavaInterop1/WriteClassProperties.txt | 1 - .../JavaInterop1/WriteCtorWithStringOverload.txt | 2 ++ .../XAJavaInterop1-NRT/WriteClass.txt | 1 - .../XAJavaInterop1-NRT/WriteClassProperties.txt | 1 - .../XAJavaInterop1-NRT/WriteCtorWithStringOverload.txt | 2 ++ .../CodeGeneratorExpectedResults/XAJavaInterop1/WriteClass.txt | 1 - .../XAJavaInterop1/WriteClassProperties.txt | 1 - .../XAJavaInterop1/WriteCtorWithStringOverload.txt | 2 ++ .../expected.ji/Core_Jar2Xml/Android.Text.SpannableString.cs | 2 ++ .../NestedTypes/Xamarin.Test.NotificationCompatBase.cs | 1 + .../expected.ji/NormalMethods/Xamarin.Test.SomeObject.cs | 1 + .../expected.ji/Streams/Java.IO.FilterOutputStream.cs | 1 + .../JavaInteropCodeGenerator.cs | 3 +++ 14 files changed, 14 insertions(+), 6 deletions(-) diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClass.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClass.txt index bd3507575..972dc529c 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClass.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClass.txt @@ -162,7 +162,6 @@ public partial class MyClass { _members.InstanceMethods.InvokeVirtualVoidMethod (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_value); - global::System.GC.KeepAlive (value); } } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClassProperties.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClassProperties.txt index ba84ba470..6801b7f39 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClassProperties.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteClassProperties.txt @@ -109,7 +109,6 @@ public virtual unsafe string Key { _members.InstanceMethods.InvokeVirtualVoidMethod (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_value); - global::System.GC.KeepAlive (value); } } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteCtorWithStringOverload.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteCtorWithStringOverload.txt index eef2acbb8..44dd780e6 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteCtorWithStringOverload.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/JavaInterop1/WriteCtorWithStringOverload.txt @@ -17,6 +17,7 @@ _members.InstanceMethods.FinishCreateInstance (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_mystring); + global::System.GC.KeepAlive (mystring); } } @@ -38,6 +39,7 @@ _members.InstanceMethods.FinishCreateInstance (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_mystring); + global::System.GC.KeepAlive (mystring); } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClass.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClass.txt index 8eb09bdd7..820ebdd66 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClass.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClass.txt @@ -162,7 +162,6 @@ public partial class MyClass { _members.InstanceMethods.InvokeVirtualVoidMethod (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_value); - global::System.GC.KeepAlive (value); } } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClassProperties.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClassProperties.txt index a5bf26a6c..e7efea768 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClassProperties.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteClassProperties.txt @@ -109,7 +109,6 @@ public virtual unsafe string? Key { _members.InstanceMethods.InvokeVirtualVoidMethod (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_value); - global::System.GC.KeepAlive (value); } } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteCtorWithStringOverload.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteCtorWithStringOverload.txt index 342763a13..3b510c039 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteCtorWithStringOverload.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1-NRT/WriteCtorWithStringOverload.txt @@ -17,6 +17,7 @@ _members.InstanceMethods.FinishCreateInstance (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_mystring); + global::System.GC.KeepAlive (mystring); } } @@ -38,6 +39,7 @@ _members.InstanceMethods.FinishCreateInstance (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_mystring); + global::System.GC.KeepAlive (mystring); } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClass.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClass.txt index 51eed1baf..b8851c8ec 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClass.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClass.txt @@ -162,7 +162,6 @@ public partial class MyClass { _members.InstanceMethods.InvokeVirtualVoidMethod (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_value); - global::System.GC.KeepAlive (value); } } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClassProperties.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClassProperties.txt index ba84ba470..6801b7f39 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClassProperties.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteClassProperties.txt @@ -109,7 +109,6 @@ public virtual unsafe string Key { _members.InstanceMethods.InvokeVirtualVoidMethod (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_value); - global::System.GC.KeepAlive (value); } } } diff --git a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteCtorWithStringOverload.txt b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteCtorWithStringOverload.txt index eef2acbb8..44dd780e6 100644 --- a/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteCtorWithStringOverload.txt +++ b/tests/generator-Tests/Unit-Tests/CodeGeneratorExpectedResults/XAJavaInterop1/WriteCtorWithStringOverload.txt @@ -17,6 +17,7 @@ _members.InstanceMethods.FinishCreateInstance (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_mystring); + global::System.GC.KeepAlive (mystring); } } @@ -38,6 +39,7 @@ _members.InstanceMethods.FinishCreateInstance (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_mystring); + global::System.GC.KeepAlive (mystring); } } diff --git a/tests/generator-Tests/expected.ji/Core_Jar2Xml/Android.Text.SpannableString.cs b/tests/generator-Tests/expected.ji/Core_Jar2Xml/Android.Text.SpannableString.cs index c2eec734b..d5c71261c 100644 --- a/tests/generator-Tests/expected.ji/Core_Jar2Xml/Android.Text.SpannableString.cs +++ b/tests/generator-Tests/expected.ji/Core_Jar2Xml/Android.Text.SpannableString.cs @@ -49,6 +49,7 @@ public unsafe SpannableString (global::Java.Lang.ICharSequence source) _members.InstanceMethods.FinishCreateInstance (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_source); + global::System.GC.KeepAlive (source); } } @@ -70,6 +71,7 @@ public unsafe SpannableString (string source) _members.InstanceMethods.FinishCreateInstance (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native_source); + global::System.GC.KeepAlive (source); } } diff --git a/tests/generator-Tests/expected.ji/NestedTypes/Xamarin.Test.NotificationCompatBase.cs b/tests/generator-Tests/expected.ji/NestedTypes/Xamarin.Test.NotificationCompatBase.cs index e1d8ae2ee..a74430f02 100644 --- a/tests/generator-Tests/expected.ji/NestedTypes/Xamarin.Test.NotificationCompatBase.cs +++ b/tests/generator-Tests/expected.ji/NestedTypes/Xamarin.Test.NotificationCompatBase.cs @@ -186,6 +186,7 @@ public unsafe InstanceInner (global::Xamarin.Test.NotificationCompatBase __self) SetHandle (__r.Handle, JniHandleOwnership.TransferLocalRef); _members.InstanceMethods.FinishCreateInstance (__id, this, __args); } finally { + global::System.GC.KeepAlive (__self); } } diff --git a/tests/generator-Tests/expected.ji/NormalMethods/Xamarin.Test.SomeObject.cs b/tests/generator-Tests/expected.ji/NormalMethods/Xamarin.Test.SomeObject.cs index e84806ca8..be3160fcf 100644 --- a/tests/generator-Tests/expected.ji/NormalMethods/Xamarin.Test.SomeObject.cs +++ b/tests/generator-Tests/expected.ji/NormalMethods/Xamarin.Test.SomeObject.cs @@ -47,6 +47,7 @@ public unsafe SomeObject (global::Java.Lang.Class c) SetHandle (__r.Handle, JniHandleOwnership.TransferLocalRef); _members.InstanceMethods.FinishCreateInstance (__id, this, __args); } finally { + global::System.GC.KeepAlive (c); } } diff --git a/tests/generator-Tests/expected.ji/Streams/Java.IO.FilterOutputStream.cs b/tests/generator-Tests/expected.ji/Streams/Java.IO.FilterOutputStream.cs index 98a29047e..2c0f3af3a 100644 --- a/tests/generator-Tests/expected.ji/Streams/Java.IO.FilterOutputStream.cs +++ b/tests/generator-Tests/expected.ji/Streams/Java.IO.FilterOutputStream.cs @@ -49,6 +49,7 @@ public unsafe FilterOutputStream (global::System.IO.Stream @out) _members.InstanceMethods.FinishCreateInstance (__id, this, __args); } finally { JNIEnv.DeleteLocalRef (native__out); + global::System.GC.KeepAlive (@out); } } diff --git a/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/JavaInteropCodeGenerator.cs b/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/JavaInteropCodeGenerator.cs index 5acf2b575..305b908c8 100644 --- a/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/JavaInteropCodeGenerator.cs +++ b/tools/generator/Java.Interop.Tools.Generator.CodeGeneration/JavaInteropCodeGenerator.cs @@ -131,6 +131,8 @@ internal override void WriteConstructorBody (Ctor ctor, string indent, System.Co writer.WriteLine ("{0}}} finally {{", indent); foreach (string cleanup in call_cleanup) writer.WriteLine ("{0}\t{1}", indent, cleanup); + foreach (var p in ctor.Parameters.Where (GenerateKeepAlive)) + writer.WriteLine ($"{indent}\tglobal::System.GC.KeepAlive ({opt.GetSafeIdentifier (p.Name)});"); writer.WriteLine ("{0}}}", indent); } @@ -209,6 +211,7 @@ bool GenerateKeepAlive (Parameter p) "byte" => false, "ubyte" => false, // Not a C# type, but we will see it from Kotlin unsigned types support "string" => false, + "java.lang.String" => false, "Android.Graphics.Color" => false, _ => true };