Skip to content

Commit 5a89eae

Browse files
authored
[Mono.Android] Remove use of JNINativeWrapper.CreateDelegate (#9741)
Context: dotnet/java-interop#1275 Context: dotnet/java-interop@356485e Throughout the years of binding `Mono.Android` there have been instances where we need to write manual binding code to work around issues in `generator`. Update these instances to mirror the latest `generator` output from dotnet/java-interop@356485ee by removing calls to `JNINativeWrapper.CreateDelegate()` that would prevent NativeAOT from functioning.
1 parent b2c73ff commit 5a89eae

File tree

8 files changed

+199
-130
lines changed

8 files changed

+199
-130
lines changed
Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,48 @@
1-
#if ANDROID_11
2-
31
using System;
2+
using Java.Interop;
43
using Android.Runtime;
54

65
namespace Android.Animation
76
{
87
public partial class AnimatorSet
98
{
10-
private static IntPtr id_setDuration_J;
9+
static Delegate cb_setDuration_SetDuration_J_Landroid_animation_Animator_;
10+
1111
[Register ("setDuration", "(J)Landroid/animation/Animator;", "GetSetDuration_JHandler")]
12-
public override Animator SetDuration (long duration)
12+
public override unsafe Android.Animation.Animator SetDuration (long duration)
1313
{
14-
if (id_setDuration_J == IntPtr.Zero)
15-
id_setDuration_J = JNIEnv.GetMethodID (class_ref, "setDuration", "(J)Landroid/animation/Animator;");
16-
17-
if (base.GetType () == this.ThresholdType) {
18-
return Java.Lang.Object.GetObject<AnimatorSet> (
19-
JNIEnv.CallObjectMethod (base.Handle, id_setDuration_J, new JValue (duration)),
20-
JniHandleOwnership.TransferLocalRef)!;
21-
} else {
22-
return Java.Lang.Object.GetObject<AnimatorSet> (
23-
JNIEnv.CallNonvirtualObjectMethod (
24-
base.Handle,
25-
this.ThresholdClass,
26-
JNIEnv.GetMethodID (ThresholdClass, "setDuration", "(J)Landroid/animation/Animator;"),
27-
new JValue (duration)),
28-
JniHandleOwnership.TransferLocalRef)!;
14+
const string __id = "setDuration.(J)Landroid/animation/Animator;";
15+
try {
16+
JniArgumentValue* __args = stackalloc JniArgumentValue [1];
17+
__args [0] = new JniArgumentValue (duration);
18+
var __rm = _members.InstanceMethods.InvokeVirtualObjectMethod (__id, this, __args);
19+
return global::Java.Lang.Object.GetObject<Android.Animation.Animator> (__rm.Handle, JniHandleOwnership.TransferLocalRef);
20+
} finally {
2921
}
3022
}
3123

32-
private static Delegate? cb_setDuration_J;
33-
34-
private static Delegate GetSetDuration_JHandler ()
24+
#pragma warning disable 0169
25+
static Delegate GetSetDuration_JHandler ()
3526
{
36-
if (cb_setDuration_J == null)
37-
cb_setDuration_J = JNINativeWrapper.CreateDelegate (new Func<IntPtr, IntPtr, long, IntPtr> (n_SetDuration_J));
38-
return cb_setDuration_J;
27+
return cb_setDuration_SetDuration_J_Landroid_animation_Animator_ ??= new _JniMarshal_PPJ_L (n_SetDuration_J);
3928
}
40-
41-
private static IntPtr n_SetDuration_J (IntPtr jnienv, IntPtr native__this, long duration)
29+
30+
[global::System.Diagnostics.DebuggerDisableUserUnhandledExceptions]
31+
static IntPtr n_SetDuration_J (IntPtr jnienv, IntPtr native__this, long duration)
4232
{
43-
AnimatorSet @object = Java.Lang.Object.GetObject<AnimatorSet> (native__this, JniHandleOwnership.DoNotTransfer)!;
44-
return JNIEnv.ToJniHandle (@object.SetDuration (duration));
33+
if (!global::Java.Interop.JniEnvironment.BeginMarshalMethod (jnienv, out var __envp, out var __r))
34+
return default;
35+
36+
try {
37+
var __this = global::Java.Lang.Object.GetObject<Android.Animation.AnimatorSet> (jnienv, native__this, JniHandleOwnership.DoNotTransfer);
38+
return JNIEnv.ToLocalJniHandle (__this.SetDuration (duration));
39+
} catch (global::System.Exception __e) {
40+
__r.OnUserUnhandledException (ref __envp, __e);
41+
return default;
42+
} finally {
43+
global::Java.Interop.JniEnvironment.EndMarshalMethod (ref __envp);
44+
}
4545
}
46+
#pragma warning restore 0169
4647
}
4748
}
48-
49-
#endif
Lines changed: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,48 @@
1-
#if ANDROID_11
2-
31
using System;
2+
using Java.Interop;
43
using Android.Runtime;
54

65
namespace Android.Animation
76
{
87
public partial class ValueAnimator
98
{
10-
private static IntPtr id_setDuration_J;
9+
static Delegate cb_setDuration_SetDuration_J_Landroid_animation_Animator_;
1110

1211
[Register ("setDuration", "(J)Landroid/animation/Animator;", "GetSetDuration_JHandler")]
13-
public override Animator SetDuration (long duration)
12+
public override unsafe Android.Animation.Animator SetDuration (long duration)
1413
{
15-
if (id_setDuration_J == IntPtr.Zero)
16-
id_setDuration_J = JNIEnv.GetMethodID (class_ref, "setDuration", "(J)Landroid/animation/Animator;");
17-
18-
if (base.GetType () == this.ThresholdType) {
19-
return Java.Lang.Object.GetObject<ValueAnimator> (
20-
JNIEnv.CallObjectMethod (base.Handle, id_setDuration_J, new JValue (duration)),
21-
JniHandleOwnership.TransferLocalRef)!;
22-
} else {
23-
return Java.Lang.Object.GetObject<ValueAnimator> (
24-
JNIEnv.CallNonvirtualObjectMethod (
25-
base.Handle,
26-
this.ThresholdClass,
27-
JNIEnv.GetMethodID (ThresholdClass, "setDuration", "(J)Landroid/animation/Animator;"),
28-
new JValue (duration)),
29-
JniHandleOwnership.TransferLocalRef)!;
14+
const string __id = "setDuration.(J)Landroid/animation/Animator;";
15+
try {
16+
JniArgumentValue* __args = stackalloc JniArgumentValue [1];
17+
__args [0] = new JniArgumentValue (duration);
18+
var __rm = _members.InstanceMethods.InvokeVirtualObjectMethod (__id, this, __args);
19+
return global::Java.Lang.Object.GetObject<Android.Animation.Animator> (__rm.Handle, JniHandleOwnership.TransferLocalRef);
20+
} finally {
3021
}
3122
}
3223

33-
private static Delegate? cb_setDuration_J;
34-
35-
private static Delegate GetSetDuration_JHandler ()
24+
#pragma warning disable 0169
25+
static Delegate GetSetDuration_JHandler ()
3626
{
37-
if (cb_setDuration_J == null)
38-
cb_setDuration_J = JNINativeWrapper.CreateDelegate (new Func<IntPtr, IntPtr, long, IntPtr> (n_SetDuration_J));
39-
return cb_setDuration_J;
27+
return cb_setDuration_SetDuration_J_Landroid_animation_Animator_ ??= new _JniMarshal_PPJ_L (n_SetDuration_J);
4028
}
41-
42-
private static IntPtr n_SetDuration_J (IntPtr jnienv, IntPtr native__this, long duration)
29+
30+
[global::System.Diagnostics.DebuggerDisableUserUnhandledExceptions]
31+
static IntPtr n_SetDuration_J (IntPtr jnienv, IntPtr native__this, long duration)
4332
{
44-
ValueAnimator @object = Java.Lang.Object.GetObject<ValueAnimator> (native__this, JniHandleOwnership.DoNotTransfer)!;
45-
return JNIEnv.ToJniHandle (@object.SetDuration (duration));
33+
if (!global::Java.Interop.JniEnvironment.BeginMarshalMethod (jnienv, out var __envp, out var __r))
34+
return default;
35+
36+
try {
37+
var __this = global::Java.Lang.Object.GetObject<Android.Animation.ValueAnimator> (jnienv, native__this, JniHandleOwnership.DoNotTransfer);
38+
return JNIEnv.ToLocalJniHandle (__this.SetDuration (duration));
39+
} catch (global::System.Exception __e) {
40+
__r.OnUserUnhandledException (ref __envp, __e);
41+
return default;
42+
} finally {
43+
global::Java.Interop.JniEnvironment.EndMarshalMethod (ref __envp);
44+
}
4645
}
46+
#pragma warning restore 0169
4747
}
4848
}
49-
50-
#endif

src/Mono.Android/Android.Bluetooth/BluetoothGattServerCallback.cs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,26 @@ void ActualOnServiceAdded (ProfileState status, BluetoothGattService? service)
2424
#pragma warning disable 0169
2525
static Delegate GetOnServiceAdded_ILandroid_bluetooth_BluetoothGattService_Handler_ext ()
2626
{
27-
if (cb_onServiceAdded_ILandroid_bluetooth_BluetoothGattService_ext == null)
28-
cb_onServiceAdded_ILandroid_bluetooth_BluetoothGattService_ext = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, int, IntPtr>) n_OnServiceAdded_ILandroid_bluetooth_BluetoothGattService_ext);
29-
return cb_onServiceAdded_ILandroid_bluetooth_BluetoothGattService_ext;
27+
return cb_onServiceAdded_ILandroid_bluetooth_BluetoothGattService_ext ??= new _JniMarshal_PPIL_V (n_OnServiceAdded_ILandroid_bluetooth_BluetoothGattService_ext);
3028
}
3129

30+
[global::System.Diagnostics.DebuggerDisableUserUnhandledExceptions]
3231
static void n_OnServiceAdded_ILandroid_bluetooth_BluetoothGattService_ext (IntPtr jnienv, IntPtr native__this, int native_status, IntPtr native_service)
3332
{
34-
Android.Bluetooth.BluetoothGattServerCallback __this = global::Java.Lang.Object.GetObject<Android.Bluetooth.BluetoothGattServerCallback> (jnienv, native__this, JniHandleOwnership.DoNotTransfer)!;
35-
Android.Bluetooth.ProfileState status = (Android.Bluetooth.ProfileState) native_status;
36-
var service = global::Java.Lang.Object.GetObject<Android.Bluetooth.BluetoothGattService> (native_service, JniHandleOwnership.DoNotTransfer);
37-
__this.ActualOnServiceAdded (status, service);
33+
if (!global::Java.Interop.JniEnvironment.BeginMarshalMethod (jnienv, out var __envp, out var __r))
34+
return;
35+
36+
try {
37+
Android.Bluetooth.BluetoothGattServerCallback __this = global::Java.Lang.Object.GetObject<Android.Bluetooth.BluetoothGattServerCallback> (jnienv, native__this, JniHandleOwnership.DoNotTransfer)!;
38+
Android.Bluetooth.ProfileState status = (Android.Bluetooth.ProfileState) native_status;
39+
var service = global::Java.Lang.Object.GetObject<Android.Bluetooth.BluetoothGattService> (native_service, JniHandleOwnership.DoNotTransfer);
40+
__this.ActualOnServiceAdded (status, service);
41+
} catch (global::System.Exception __e) {
42+
__r.OnUserUnhandledException (ref __envp, __e);
43+
return;
44+
} finally {
45+
global::Java.Interop.JniEnvironment.EndMarshalMethod (ref __envp);
46+
}
3847
}
3948
#pragma warning restore 0169
4049
}

src/Mono.Android/Android.Telephony/CellInfo.cs

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,25 @@ public partial class CellInfo {
1414
[global::System.Runtime.Versioning.SupportedOSPlatform ("android28.0")]
1515
static Delegate GetGetCellIdentityHandler ()
1616
{
17-
if (cb_getCellIdentity == null)
18-
cb_getCellIdentity = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, IntPtr>) n_GetCellIdentity);
19-
return cb_getCellIdentity;
17+
return cb_getCellIdentity ??= new _JniMarshal_PP_L (n_GetCellIdentity);
2018
}
2119

20+
[global::System.Diagnostics.DebuggerDisableUserUnhandledExceptions]
2221
[global::System.Runtime.Versioning.SupportedOSPlatform ("android28.0")]
2322
static IntPtr n_GetCellIdentity (IntPtr jnienv, IntPtr native__this)
2423
{
25-
var __this = global::Java.Lang.Object.GetObject<Android.Telephony.CellInfo> (jnienv, native__this, JniHandleOwnership.DoNotTransfer)!;
26-
return JNIEnv.ToLocalJniHandle (__this.CellIdentity);
24+
if (!global::Java.Interop.JniEnvironment.BeginMarshalMethod (jnienv, out var __envp, out var __r))
25+
return default;
26+
27+
try {
28+
var __this = global::Java.Lang.Object.GetObject<Android.Telephony.CellInfo> (jnienv, native__this, JniHandleOwnership.DoNotTransfer)!;
29+
return JNIEnv.ToLocalJniHandle (__this.CellIdentity);
30+
} catch (global::System.Exception __e) {
31+
__r.OnUserUnhandledException (ref __envp, __e);
32+
return default;
33+
} finally {
34+
global::Java.Interop.JniEnvironment.EndMarshalMethod (ref __envp);
35+
}
2736
}
2837
#pragma warning restore 0169
2938

@@ -47,15 +56,24 @@ public unsafe virtual Android.Telephony.CellIdentity CellIdentity {
4756
#pragma warning disable 0169
4857
static Delegate GetGetCellSignalStrengthHandler ()
4958
{
50-
if (cb_getCellSignalStrength == null)
51-
cb_getCellSignalStrength = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, IntPtr>) n_GetCellSignalStrength);
52-
return cb_getCellSignalStrength;
59+
return cb_getCellSignalStrength ??= new _JniMarshal_PP_L (n_GetCellSignalStrength);
5360
}
5461

62+
[global::System.Diagnostics.DebuggerDisableUserUnhandledExceptions]
5563
static IntPtr n_GetCellSignalStrength (IntPtr jnienv, IntPtr native__this)
5664
{
57-
var __this = global::Java.Lang.Object.GetObject<Android.Telephony.CellInfo> (jnienv, native__this, JniHandleOwnership.DoNotTransfer)!;
58-
return JNIEnv.ToLocalJniHandle (__this.CellSignalStrength);
65+
if (!global::Java.Interop.JniEnvironment.BeginMarshalMethod (jnienv, out var __envp, out var __r))
66+
return default;
67+
68+
try {
69+
var __this = global::Java.Lang.Object.GetObject<Android.Telephony.CellInfo> (jnienv, native__this, JniHandleOwnership.DoNotTransfer)!;
70+
return JNIEnv.ToLocalJniHandle (__this.CellSignalStrength);
71+
} catch (global::System.Exception __e) {
72+
__r.OnUserUnhandledException (ref __envp, __e);
73+
return default;
74+
} finally {
75+
global::Java.Interop.JniEnvironment.EndMarshalMethod (ref __envp);
76+
}
5977
}
6078
#pragma warning restore 0169
6179

src/Mono.Android/Android.Widget/AbsListView.cs

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,31 +13,49 @@ partial class AbsListView {
1313
#pragma warning disable 0169
1414
static Delegate GetGetAdapterHandler ()
1515
{
16-
if (cb_getAdapter == null)
17-
cb_getAdapter = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, IntPtr>) n_GetAdapter);
18-
return cb_getAdapter;
16+
return cb_getAdapter ??= new _JniMarshal_PP_L (n_GetAdapter);
1917
}
2018

2119
static IntPtr id_getAdapter;
20+
[global::System.Diagnostics.DebuggerDisableUserUnhandledExceptions]
2221
static IntPtr n_GetAdapter (IntPtr jnienv, IntPtr native__this)
2322
{
24-
var __this = global::Java.Lang.Object.GetObject<Android.Widget.AbsListView> (jnienv, native__this, JniHandleOwnership.DoNotTransfer)!;
25-
return JNIEnv.ToLocalJniHandle (__this.Adapter);
23+
if (!global::Java.Interop.JniEnvironment.BeginMarshalMethod (jnienv, out var __envp, out var __r))
24+
return default;
25+
26+
try {
27+
var __this = global::Java.Lang.Object.GetObject<Android.Widget.AbsListView> (jnienv, native__this, JniHandleOwnership.DoNotTransfer)!;
28+
return JNIEnv.ToLocalJniHandle (__this.Adapter);
29+
} catch (global::System.Exception __e) {
30+
__r.OnUserUnhandledException (ref __envp, __e);
31+
return default;
32+
} finally {
33+
global::Java.Interop.JniEnvironment.EndMarshalMethod (ref __envp);
34+
}
2635
}
2736

2837
static Delegate? cb_setAdapter_Landroid_widget_Adapter_;
2938
#pragma warning disable 0169
3039
static Delegate GetSetAdapter_Landroid_widget_ListAdapter_Handler ()
3140
{
32-
if (cb_setAdapter_Landroid_widget_Adapter_ == null)
33-
cb_setAdapter_Landroid_widget_Adapter_ = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, IntPtr>) n_SetAdapter_Landroid_widget_ListAdapter_);
34-
return cb_setAdapter_Landroid_widget_Adapter_;
41+
return cb_setAdapter_Landroid_widget_Adapter_ ??= new _JniMarshal_PPL_V (n_SetAdapter_Landroid_widget_ListAdapter_);
3542
}
3643

44+
[global::System.Diagnostics.DebuggerDisableUserUnhandledExceptions]
3745
static void n_SetAdapter_Landroid_widget_ListAdapter_ (IntPtr jnienv, IntPtr native__this, IntPtr native_adapter)
3846
{
39-
var __this = Java.Lang.Object.GetObject<Android.Widget.AbsListView> (jnienv, native__this, JniHandleOwnership.DoNotTransfer)!;
40-
__this.Adapter = Java.Interop.JavaConvert.FromJniHandle<IListAdapter> (native_adapter, JniHandleOwnership.DoNotTransfer);
47+
if (!global::Java.Interop.JniEnvironment.BeginMarshalMethod (jnienv, out var __envp, out var __r))
48+
return;
49+
50+
try {
51+
var __this = Java.Lang.Object.GetObject<Android.Widget.AbsListView> (jnienv, native__this, JniHandleOwnership.DoNotTransfer)!;
52+
__this.Adapter = Java.Interop.JavaConvert.FromJniHandle<IListAdapter> (native_adapter, JniHandleOwnership.DoNotTransfer);
53+
} catch (global::System.Exception __e) {
54+
__r.OnUserUnhandledException (ref __envp, __e);
55+
return;
56+
} finally {
57+
global::Java.Interop.JniEnvironment.EndMarshalMethod (ref __envp);
58+
}
4159
}
4260
#pragma warning restore 0169
4361

0 commit comments

Comments
 (0)