Skip to content

Crash in generated marshal method returning View #374

@radekdoulik

Description

@radekdoulik

When using JNI marshal methods with Xamarin.Forms app, we get crash after following marshal method is used:

public static IntPtr n_onCreateView_Landroid_view_LayoutInflater_Landroid_view_ViewGroup_Landroid_os_Bundle_ (IntPtr __jnienv, IntPtr __this, IntPtr inflater, IntPtr container, IntPtr savedInstanceState)
{
	JniTransition jniTransition = new JniTransition (__jnienv);
	JniRuntime runtime = default(JniRuntime);
	JniObjectReference value5 = default(JniObjectReference);
	try {
		runtime = JniEnvironment.Runtime;
		JniRuntime.JniValueManager valueManager = runtime.ValueManager;
		valueManager.WaitForGCBridgeProcessing ();
		FragmentContainer value = valueManager.GetValue<FragmentContainer> (__this);
		LayoutInflater value2 = valueManager.GetValue<LayoutInflater> (inflater);
		ViewGroup value3 = valueManager.GetValue<ViewGroup> (container);
		Bundle value4 = valueManager.GetValue<Bundle> (savedInstanceState);
		global::Android.Views.View view = value.OnCreateView (value2, value3, value4);
		value5 = ((view != null) ? view.PeerReference : default(JniObjectReference));
		IntPtr handle = value5.Handle;
		return JniEnvironment.References.NewReturnToJniRef (value5);
		IL_0087:;
	} catch (Exception ex) when (runtime.ExceptionShouldTransitionToJni (ex)) {
		jniTransition.SetPendingException (ex);
		return default(IntPtr);
		IL_00c5:;
	} finally {
		JniObjectReference.Dispose (ref value5);
		jniTransition.Dispose ();
	}
	IntPtr intPtr = default(IntPtr);
	return intPtr;
}

The generated method has few issues:

  • it should not call JniObjectReference.Dispose in the finally block as it will release the global reference
  • there seems to be unnecessary leave in try and catch blocks
  • unsed handle variable

The probable cause of the crash is that we are returning released gref. I need to look at JniEnvironment.References.NewReturnToJniRef in detail to confirm that.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions