Skip to content
This repository was archived by the owner on May 1, 2024. It is now read-only.
This repository was archived by the owner on May 1, 2024. It is now read-only.

[Bug] [Android] Crash when calling Platform.ClearRenderer(...) #11029

@velocitysystems

Description

@velocitysystems

Description

A crash occurs when calling Platform.ClearRenderer(..) from the Dispose method block in a custom renderer.

Previously custom renderers which needed to cleanup and detach the renderer from the Element would call Platform.ClearRenderer() in the dispose method block. This worked for several years up until recently.

Steps to Reproduce

Create a custom renderer.
In the Dispose method block, call Platform.ClearRenderer(..) to detach the renderer from the Element.
App crash with stack trace below.

Expected Behavior

The app should not crash.

Actual Behavior

The app crashes with the following exception and stack trace:
System.ArgumentException: Must have a valid JNI object reference!

06-12 12:30:42.757 I/MonoDroid( 8577): UNHANDLED EXCEPTION:
06-12 12:30:42.763 I/MonoDroid( 8577): System.ArgumentException: Must have a valid JNI object reference!
06-12 12:30:42.763 I/MonoDroid( 8577): Parameter name: value
06-12 12:30:42.763 I/MonoDroid( 8577):   at Android.Runtime.AndroidValueManager.RemovePeer (Java.Interop.IJavaPeerable value) [0x0001e] in <55654ebe9f2a48e6bade2862bb243f94>:0 
06-12 12:30:42.763 I/MonoDroid( 8577):   at Java.Interop.JniRuntime+JniValueManager.DisposePeer (Java.Interop.JniObjectReference h, Java.Interop.IJavaPeerable value) [0x0001f] in <dac4c5a4b77f4e61a5e6d9d3050dfb9f>:0 
06-12 12:30:42.763 I/MonoDroid( 8577):   at Java.Interop.JniRuntime+JniValueManager.DisposePeer (Java.Interop.IJavaPeerable value) [0x00038] in <dac4c5a4b77f4e61a5e6d9d3050dfb9f>:0 
06-12 12:30:42.763 I/MonoDroid( 8577):   at Java.Lang.Object.Dispose () [0x00000] in <55654ebe9f2a48e6bade2862bb243f94>:0 
06-12 12:30:42.763 I/MonoDroid( 8577):   at Xamarin.Forms.Platform.Android.VisualElementPackager.RemoveChild (Xamarin.Forms.VisualElement view) [0x0007f] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:275 
06-12 12:30:42.763 I/MonoDroid( 8577):   at Xamarin.Forms.Platform.Android.VisualElementPackager.SetElement (Xamarin.Forms.VisualElement oldElement, Xamarin.Forms.VisualElement newElement) [0x000ab] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:321 
06-12 12:30:42.763 I/MonoDroid( 8577):   at Xamarin.Forms.Platform.Android.VisualElementPackager.Dispose (System.Boolean disposing) [0x000ad] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:88 
06-12 12:30:42.764 I/MonoDroid( 8577):   at Xamarin.Forms.Platform.Android.VisualElementPackager.Dispose () [0x00000] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:61 
06-12 12:30:42.764 I/MonoDroid( 8577):   at Xamarin.Forms.Platform.Android.VisualElementRenderer`1[TElement].Dispose (System.Boolean disposing) [0x00081] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:306 
06-12 12:30:42.764 I/MonoDroid( 8577):   at Xamarin.Forms.Platform.Android.Platform+DefaultRenderer.Dispose (System.Boolean disposing) [0x0001a] in D:\a\1\s\Xamarin.Forms.Platform.Android\Platform.cs:1306 
06-12 12:30:42.764 I/MonoDroid( 8577):   at Java.Lang.Object.Java.Interop.IJavaPeerable.Disposed () [0x00000] in <55654ebe9f2a48e6bade2862bb243f94>:0 
06-12 12:30:42.764 I/MonoDroid( 8577):   at Java.Interop.JniRuntime+JniValueManager.DisposePeer (Java.Interop.JniObjectReference h, Java.Interop.IJavaPeerable value) [0x00019] in <dac4c5a4b77f4e61a5e6d9d3050dfb9f>:0 
06-12 12:30:42.764 I/MonoDroid( 8577):   at Java.Interop.JniRuntime+JniValueManager.DisposePeer (Java.Interop.IJavaPeerable value) [0x00038] in <dac4c5a4b77f4e61a5e6d9d3050dfb9f>:0 
06-12 12:30:42.764 I/MonoDroid( 8577):   at Java.Lang.Object.Dispose () [0x00000] in <55654ebe9f2a48e6bade2862bb243f94>:0 
06-12 12:30:42.764 I/MonoDroid( 8577):   at Xamarin.Forms.Platform.Android.VisualElementPackager.RemoveChild (Xamarin.Forms.VisualElement view) [0x0007f] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:275 
06-12 12:30:42.764 I/MonoDroid( 8577):   at Xamarin.Forms.Platform.Android.VisualElementPackager.SetElement (Xamarin.Forms.VisualElement oldElement, Xamarin.Forms.VisualElement newElement) [0x000ab] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:321 
06-12 12:30:42.764 I/MonoDroid( 8577):   at Xamarin.Forms.Platform.Android.VisualElementPackager.Dispose (System.Boolean disposing) [0x000ad] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:88 
06-12 12:30:42.765 I/MonoDroid( 8577):   at Xamarin.Forms.Platform.Android.VisualElementPackager.Dispose () [0x00000] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:61 
06-12 12:30:42.765 I/MonoDroid( 8577):   at Xamarin.Forms.Platform.Android.VisualElementRenderer`1[TElement].Dispose (System.Boolean disposing) [0x00081] in D:\a\1\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:306 
06-12 12:30:42.765 I/MonoDroid( 8577):   at Xamarin.Forms.Platform.Android.PageRenderer.Dispose (System.Boolean disposing) [0x00024] in D:\a\1\s\Xamarin.Forms.Platform.Android\Renderers\PageRenderer.cs:59 
06-12 12:30:42.765 I/MonoDroid( 8577):   at Java.Lang.Object.Java.Interop.IJavaPeerable.Disposed () [0x00000] in <55654ebe9f2a48e6bade2862bb243f94>:0 
06-12 12:30:42.765 I/MonoDroid( 8577):   at Java.Interop.JniRuntime+JniValueManager.DisposePeer (Java.Interop.JniObjectReference h, Java.Interop.IJavaPeerable value) [0x00019] in <dac4c5a4b77f4e61a5e6d9d3050dfb9f>:0 
06-12 12:30:42.766 I/MonoDroid( 8577):   at Java.Interop.JniRuntime+JniValueManager.DisposePeer (Java.Interop.IJavaPeerable value) [0x00038] in <dac4c5a4b77f4e61a5e6d9d3050dfb9f>:0 
06-12 12:30:42.766 I/MonoDroid( 8577):   at Java.Lang.Object.Dispose () [0x00000] in <55654ebe9f2a48e6bade2862bb243f94>:0 
06-12 12:30:42.766 I/MonoDroid( 8577):   at Xamarin.Forms.Platform.Android.AppCompat.FragmentContainer.OnDestroyView () [0x0003c] in D:\a\1\s\Xamarin.Forms.Platform.Android\AppCompat\FragmentContainer.cs:88 
06-12 12:30:42.766 I/MonoDroid( 8577):   at Android.Support.V4.App.Fragment.n_OnDestroyView (System.IntPtr jnienv, System.IntPtr native__this) [0x00008] in <fefee6c2c695459088a9df092723e052>:0 
06-12 12:30:42.766 I/MonoDroid( 8577):   at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.68(intptr,intptr) in D:\a\1\s\Xamarin.Forms.Platform.And

Basic Information

  • Version with issue: 4.6.0-sr2 and above
  • Last known good version: N/A - Seems related to Xamarin.Android/Mono itself.
  • IDE: Microsoft Visual Studio 2019 Enterprise 16.6.2
  • Platform Target Frameworks:
    • Android SDK: 10.3.1.4
  • Android Support Library Version: 28.0.0.3

Reproduction Link

To be supplied.

Workaround

See workaround documented below.

Metadata

Metadata

Assignees

No one assigned

    Labels

    4.6.0regression on 4.6.0a/navigationi/highCompletely doesn't work, crashes, or is unusably slow, has no obvious workaround; occurs less ofteni/regressionp/Androids/needs-info ❓A question has been asked that requires an answer before work can continue on this issue.s/needs-repro ❔This reported issue doesn't include a sample project reproducing the issue. Please provide one.s/unverifiedNew report that has yet to be verifiedt/bug 🐛

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions