Skip to content

Commit 619286d

Browse files
authored
[generator] Add [UnmanagedFunctionPointer] to _JniMarshal* decls (#1281)
Fixes: #1262 Context: 2197579 > NativeAOT doesn't like [using delegates for > `JNIEnv::RegisterNatives()`] by default. In order to convince > NativeAOT to support this, every delegate instance provided to > `JniNativeMethodRegistration.Delegate` must be of a delegate type > which has [`UnmanagedFunctionPointerAttribute`][6]. This coerces > NativeAOT to emit "stubs" for the referenced method, allowing things > to work with fewer changes. > > [6]: https://learn.microsoft.com/dotnet/api/system.runtime.interopservices.unmanagedfunctionpointerattribute?view=net-8.0 For possible future NativeAOT support, every `_JniMarshal_*` delegate emitted by `generator` needs to have `[UnmanagedFunctionPointer]`:: [UnmanagedFunctionPointer (CallingConvention.Winapi)] delegate long _JniMarshal_PP_L (IntPtr env, IntPtr klass, long value);
1 parent 2d48efe commit 619286d

File tree

15 files changed

+47
-1
lines changed

15 files changed

+47
-1
lines changed

tests/generator-Tests/expected.xaji/AccessModifiers/__NamespaceMapping__.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
[assembly:global::Android.Runtime.NamespaceMapping (Java = "java.lang", Managed="Java.Lang")]
44
[assembly:global::Android.Runtime.NamespaceMapping (Java = "xamarin.test", Managed="Xamarin.Test")]
55

6+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
67
delegate void _JniMarshal_PP_V (IntPtr jnienv, IntPtr klass);
78
#if !NET
89
namespace System.Runtime.Versioning {

tests/generator-Tests/expected.xaji/Adapters/__NamespaceMapping__.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
[assembly:global::Android.Runtime.NamespaceMapping (Java = "java.lang", Managed="Java.Lang")]
44
[assembly:global::Android.Runtime.NamespaceMapping (Java = "xamarin.test", Managed="Xamarin.Test")]
55

6+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
67
delegate IntPtr _JniMarshal_PP_L (IntPtr jnienv, IntPtr klass);
8+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
79
delegate void _JniMarshal_PPL_V (IntPtr jnienv, IntPtr klass, IntPtr p0);
810
#if !NET
911
namespace System.Runtime.Versioning {

tests/generator-Tests/expected.xaji/Android.Graphics.Color/__NamespaceMapping__.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
[assembly:global::Android.Runtime.NamespaceMapping (Java = "java.lang", Managed="Java.Lang")]
44
[assembly:global::Android.Runtime.NamespaceMapping (Java = "xamarin.test", Managed="Xamarin.Test")]
55

6+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
67
delegate int _JniMarshal_PP_I (IntPtr jnienv, IntPtr klass);
8+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
79
delegate void _JniMarshal_PPI_V (IntPtr jnienv, IntPtr klass, int p0);
810
#if !NET
911
namespace System.Runtime.Versioning {

tests/generator-Tests/expected.xaji/CSharpKeywords/__NamespaceMapping__.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
[assembly:global::Android.Runtime.NamespaceMapping (Java = "java.lang", Managed="Java.Lang")]
44
[assembly:global::Android.Runtime.NamespaceMapping (Java = "xamarin.test", Managed="Xamarin.Test")]
55

6+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
67
delegate IntPtr _JniMarshal_PP_L (IntPtr jnienv, IntPtr klass);
8+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
79
delegate IntPtr _JniMarshal_PPI_L (IntPtr jnienv, IntPtr klass, int p0);
810
#if !NET
911
namespace System.Runtime.Versioning {

tests/generator-Tests/expected.xaji/Core_Jar2Xml/__NamespaceMapping__.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
[assembly:global::Android.Runtime.NamespaceMapping (Java = "android.text", Managed="Android.Text")]
55
[assembly:global::Android.Runtime.NamespaceMapping (Java = "java.lang", Managed="Java.Lang")]
66

7+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
78
delegate int _JniMarshal_PPL_I (IntPtr jnienv, IntPtr klass, IntPtr p0);
9+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
810
delegate void _JniMarshal_PPL_V (IntPtr jnienv, IntPtr klass, IntPtr p0);
911
#if !NET
1012
namespace System.Runtime.Versioning {

tests/generator-Tests/expected.xaji/GenericArguments/__NamespaceMapping__.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
[assembly:global::Android.Runtime.NamespaceMapping (Java = "java.lang", Managed="Java.Lang")]
44
[assembly:global::Android.Runtime.NamespaceMapping (Java = "com.google.android.exoplayer.drm", Managed="Com.Google.Android.Exoplayer.Drm")]
55

6+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
67
delegate void _JniMarshal_PPL_V (IntPtr jnienv, IntPtr klass, IntPtr p0);
8+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
79
delegate bool _JniMarshal_PPL_Z (IntPtr jnienv, IntPtr klass, IntPtr p0);
10+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
811
delegate void _JniMarshal_PPLLIIL_V (IntPtr jnienv, IntPtr klass, IntPtr p0, IntPtr p1, int p2, int p3, IntPtr p4);
912
#if !NET
1013
namespace System.Runtime.Versioning {

tests/generator-Tests/expected.xaji/InterfaceMethodsConflict/__NamespaceMapping__.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
[assembly:global::Android.Runtime.NamespaceMapping (Java = "java.lang", Managed="Java.Lang")]
44
[assembly:global::Android.Runtime.NamespaceMapping (Java = "xamarin.test", Managed="Xamarin.Test")]
55

6+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
67
delegate void _JniMarshal_PP_V (IntPtr jnienv, IntPtr klass);
78
#if !NET
89
namespace System.Runtime.Versioning {

tests/generator-Tests/expected.xaji/NestedTypes/__NamespaceMapping__.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
[assembly:global::Android.Runtime.NamespaceMapping (Java = "java.lang", Managed="Java.Lang")]
44
[assembly:global::Android.Runtime.NamespaceMapping (Java = "xamarin.test", Managed="Xamarin.Test")]
55

6+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
67
delegate IntPtr _JniMarshal_PPI_L (IntPtr jnienv, IntPtr klass, int p0);
78
#if !NET
89
namespace System.Runtime.Versioning {

tests/generator-Tests/expected.xaji/NormalMethods/__NamespaceMapping__.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,19 @@
44
[assembly:global::Android.Runtime.NamespaceMapping (Java = "java.util", Managed="Java.Util")]
55
[assembly:global::Android.Runtime.NamespaceMapping (Java = "xamarin.test", Managed="Xamarin.Test")]
66

7+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
78
delegate int _JniMarshal_PP_I (IntPtr jnienv, IntPtr klass);
9+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
810
delegate IntPtr _JniMarshal_PP_L (IntPtr jnienv, IntPtr klass);
11+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
912
delegate void _JniMarshal_PP_V (IntPtr jnienv, IntPtr klass);
13+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
1014
delegate IntPtr _JniMarshal_PPI_L (IntPtr jnienv, IntPtr klass, int p0);
15+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
1116
delegate void _JniMarshal_PPL_V (IntPtr jnienv, IntPtr klass, IntPtr p0);
17+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
1218
delegate void _JniMarshal_PPLIL_V (IntPtr jnienv, IntPtr klass, IntPtr p0, int p1, IntPtr p2);
19+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
1320
delegate int _JniMarshal_PPLL_I (IntPtr jnienv, IntPtr klass, IntPtr p0, IntPtr p1);
1421
#if !NET
1522
namespace System.Runtime.Versioning {

tests/generator-Tests/expected.xaji/NormalProperties/__NamespaceMapping__.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,13 @@
33
[assembly:global::Android.Runtime.NamespaceMapping (Java = "java.lang", Managed="Java.Lang")]
44
[assembly:global::Android.Runtime.NamespaceMapping (Java = "xamarin.test", Managed="Xamarin.Test")]
55

6+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
67
delegate int _JniMarshal_PP_I (IntPtr jnienv, IntPtr klass);
8+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
79
delegate IntPtr _JniMarshal_PP_L (IntPtr jnienv, IntPtr klass);
10+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
811
delegate void _JniMarshal_PPI_V (IntPtr jnienv, IntPtr klass, int p0);
12+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
913
delegate void _JniMarshal_PPL_V (IntPtr jnienv, IntPtr klass, IntPtr p0);
1014
#if !NET
1115
namespace System.Runtime.Versioning {

tests/generator-Tests/expected.xaji/ParameterXPath/__NamespaceMapping__.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
[assembly:global::Android.Runtime.NamespaceMapping (Java = "java.util", Managed="Java.Util")]
55
[assembly:global::Android.Runtime.NamespaceMapping (Java = "xamarin.test", Managed="Xamarin.Test")]
66

7+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
78
delegate void _JniMarshal_PPL_V (IntPtr jnienv, IntPtr klass, IntPtr p0);
89
#if !NET
910
namespace System.Runtime.Versioning {

tests/generator-Tests/expected.xaji/Streams/__NamespaceMapping__.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,25 @@
33
[assembly:global::Android.Runtime.NamespaceMapping (Java = "java.lang", Managed="Java.Lang")]
44
[assembly:global::Android.Runtime.NamespaceMapping (Java = "java.io", Managed="Java.IO")]
55

6+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
67
delegate int _JniMarshal_PP_I (IntPtr jnienv, IntPtr klass);
8+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
79
delegate IntPtr _JniMarshal_PP_L (IntPtr jnienv, IntPtr klass);
10+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
811
delegate void _JniMarshal_PP_V (IntPtr jnienv, IntPtr klass);
12+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
913
delegate bool _JniMarshal_PP_Z (IntPtr jnienv, IntPtr klass);
14+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
1015
delegate void _JniMarshal_PPI_V (IntPtr jnienv, IntPtr klass, int p0);
16+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
1117
delegate long _JniMarshal_PPJ_J (IntPtr jnienv, IntPtr klass, long p0);
18+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
1219
delegate int _JniMarshal_PPL_I (IntPtr jnienv, IntPtr klass, IntPtr p0);
20+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
1321
delegate void _JniMarshal_PPL_V (IntPtr jnienv, IntPtr klass, IntPtr p0);
22+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
1423
delegate int _JniMarshal_PPLII_I (IntPtr jnienv, IntPtr klass, IntPtr p0, int p1, int p2);
24+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
1525
delegate void _JniMarshal_PPLII_V (IntPtr jnienv, IntPtr klass, IntPtr p0, int p1, int p2);
1626
#if !NET
1727
namespace System.Runtime.Versioning {

tests/generator-Tests/expected.xaji/TestInterface/__NamespaceMapping__.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,17 @@
55
[assembly:global::Android.Runtime.NamespaceMapping (Java = "test.me", Managed="Test.ME")]
66
[assembly:global::Android.Runtime.NamespaceMapping (Java = "", Managed="")]
77

8+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
89
delegate IntPtr _JniMarshal_PP_L (IntPtr jnienv, IntPtr klass);
10+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
911
delegate void _JniMarshal_PP_V (IntPtr jnienv, IntPtr klass);
12+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
1013
delegate int _JniMarshal_PPL_I (IntPtr jnienv, IntPtr klass, IntPtr p0);
14+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
1115
delegate IntPtr _JniMarshal_PPL_L (IntPtr jnienv, IntPtr klass, IntPtr p0);
16+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
1217
delegate void _JniMarshal_PPL_V (IntPtr jnienv, IntPtr klass, IntPtr p0);
18+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
1319
delegate bool _JniMarshal_PPL_Z (IntPtr jnienv, IntPtr klass, IntPtr p0);
1420
#if !NET
1521
namespace System.Runtime.Versioning {

tests/generator-Tests/expected.xaji/java.lang.Enum/__NamespaceMapping__.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
[assembly:global::Android.Runtime.NamespaceMapping (Java = "java.lang", Managed="Java.Lang")]
44

5+
[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]
56
delegate int _JniMarshal_PPL_I (IntPtr jnienv, IntPtr klass, IntPtr p0);
67
#if !NET
78
namespace System.Runtime.Versioning {

tools/generator/Java.Interop.Tools.Generator.ObjectModel/NamespaceMapping.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,12 @@ public void Generate (CodeGenerationOptions opt, GenerationInfo gen_info)
3131
sw.WriteLine ();
3232
}
3333

34+
// [UnmanagedFunctionPointer (CallingConvention.Winapi)]
3435
// delegate bool _JniMarshal_PPL_Z (IntPtr jnienv, IntPtr klass, IntPtr a);
35-
foreach (var jni in opt.GetJniMarshalDelegates ())
36+
foreach (var jni in opt.GetJniMarshalDelegates ()) {
37+
sw.WriteLine ("[global::System.Runtime.InteropServices.UnmanagedFunctionPointer (global::System.Runtime.InteropServices.CallingConvention.Winapi)]");
3638
sw.WriteLine ($"delegate {FromJniType (jni[jni.Length - 1])} {jni} (IntPtr jnienv, IntPtr klass{GetDelegateParameters (jni)});");
39+
}
3740

3841
// [SupportedOSPlatform] only exists in .NET 5.0+, so we need to generate a
3942
// dummy one so earlier frameworks can compile.

0 commit comments

Comments
 (0)