-
Notifications
You must be signed in to change notification settings - Fork 62
Closed
Description
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.Disposein the finally block as it will release the global reference - there seems to be unnecessary leave in try and catch blocks
- unsed
handlevariable
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
Labels
No labels