Skip to content

Commit

Permalink
[generator] Use custom delegates instead of Func/Action. (#632)
Browse files Browse the repository at this point in the history
Fixes: #631

Context: dotnet/runtime#32963
Context: https://github.com/dotnet/csharplang/blob/master/proposals/function-pointers.md

*Of `Delegate`s and JNI Callbacks…*

~~ Background ~~

In order for Java code to invoke Managed Code such as C#, several
things must happen:

 1. There must be a Java class which declares `native` methods.
 2. The Java class' `native` methods must be [*resolvable*][0]

Java `native` method resolution can be done by [C function name][1]
*or* by using [`JNIEnv::RegisterNatives()`][2]:

	// C++
	struct JNINativeMethod {
	    const char *name;
	    const char *signature;
	    const void *fnPtr;
	};

	/* partial */ struct JNIEnv {
	    jint RegisterNatives(jclass clazz, const JNINativeMethod *methods, jint nMethods);
	};

`JNINativeMethods::fnPtr` is a pointer to a *C callable function*
that accepts [JNI Native Method Arguments][3].

Java.Interop doesn't currently support resolution via C function name,
and instead binds the `JNINativeMethod` struct as
`JniNativeMethodRegistration`, and `JNIEnv::RegisterNatives()` as
`Java.Interop.JniEnvironment.Types.RegisterNatives()`:

	// C#
	public partial struct JniNativeMethodRegistration {
	    public  string    Name;
	    public  string    Signature;
	    public  Delegate  Marshaler;
	}
	public partial class JniEnvironment {
	    public partial class Types {
	        public static void RegisterNatives (JniObjectReference type, JniNativeMethodRegistration [] methods);
	    }
	}

Through the glory that is [Platform Invoke Delegate Marshaling][4]
and/or [`Marshal.GetFunctionPointerForDelegate()`][5], managed code
can provide a `Delegate` instance in
`JniNativeMethodRegistration.Marshaler` and have JNI invoke that
delegate when the corresponding Java `native` method is invoked.

`tools/generator` is responsible for emitting this glue code, e.g.
in order to support registering overrides of
[`java.lang.Object.equals()`][6]:

	// C# emitted by `tools/generator`:
	namespace Java.Lang {
	  partial class Object {
	    static Delegate cb_equals_Ljava_lang_Object_;
	    static Delegate GetEquals_Ljava_lang_Object_Handler ()
	    {
	      if (cb_equals_Ljava_lang_Object_ == null)
	        cb_equals_Ljava_lang_Object_ = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, IntPtr, bool>) n_Equals_Ljava_lang_Object_);
	      return cb_equals_Ljava_lang_Object_;
	    }

	    static bool n_Equals_Ljava_lang_Object_ (IntPtr jnienv, IntPtr native__this, IntPtr native_obj)
	    {
	      var __this = global::Java.Lang.Object.GetObject<Java.Lang.Object> (jnienv, native__this, JniHandleOwnership.DoNotTransfer);
	      var obj = global::Java.Lang.Object.GetObject<Java.Lang.Object> (native_obj, JniHandleOwnership.DoNotTransfer);
	      bool __ret = __this.Equals (obj);
	      return __ret;
	    }
	  }
	}

`Object.n_Equals_Ljava_lang_Object()` is stored in a
`Func<IntPtr, IntPtr, IntPtr, bool>` -- which conforms to JNI Native
Method Arguments -- and is then provided to
[`JNINativeWrapper.CreateDelegate()`][7], which uses
`System.Reflection.Emit` to "wrap" `n_Equals_Ljava_lang_Object()` for
exception propagation purposes.  Eventually and ultimately, when a C#
class overrides `Java.Lang.Object.Equals()`,
`Object.GetEquals_Ljava_lang_Object_Handler()` will be invoked at
runtime, and `Object.cb_equals_Ljava_lang_Object` will be stored into
`JniNativeMethodRegistration.Marshaler`.


~~ `Action<…>` and `Func<…>` ~~

There is one problem with the above approach: its use of the
`System.Action<…>` and `System.Func<…>` types used at the core of
registering native methods with JNI.  There are two problems with
using these sets of types:

 1. These delegate types only permit up to 16 parameters.  Given that
    *two* parameters are always "eaten" by the `JNIEnv*` pointer and
    a `jobject` to Java's `this` or a `jclass` to the declaring class,
    that means that we can only bind methods taking up to 14 methods.
    Java methods which take more than 14 methods are skipped.

 2. .NET Framework and CoreCLR don't support using generic types with
    the Platform Invoke marshaler and
    [`Marshal.GetFunctionPointerForDelegate()`][8].

(1) has been a longstanding problem, which we've been ignoring.

(2) isn't *yet* a problem, and is something @jonpryor has been keen
to address for awhile.


~~ C# Function Pointers? ~~

There is a proposal to [add Function Pointers to the C# language][9].
This would permit reduced overheads and improved efficiencies in
obtaining a function pointer to pass into Java code.

Unfortunately:

 1. The proposal is still ongoing, with no known release date.
 2. .NET Framework 4.x won't support them.
 3. They can't be used within the current Xamarin.Android architecture.

There doesn't appear to be a way to obtain a `Delegate` from a
`delegate*`, which means `JNINativeWrapper.CreateDelegate()` cannot
be used with Function Pointers.

In order to use Function Pointers, we would likely need to *require*
use of `tools/jnimarshalmethod-gen.exe` (176240d) so that appropriate
JNI Native Method Argument-conforming methods with the
`NativeCallableAttribute` can be generated at app build time,
*avoiding* the current Reflection-heavy registration path which
involves e.g. `Object.GetEquals_Ljava_lang_Object_Handler()`.

Unfortunately, `jnimarshalmethod-gen.exe` isn't "done": it doesn't
work on Windows, and it's use of `AppDomain`s and
`System.Reflection.Emit` look to complicate a future .NET 5 port.


~~ Solution: Generate Delegates ~~

If `Action<…>` and `Func<…>` are to be avoided, and Function Pointers
are out, how do we support more than 14 parameters?

By updating `generator` to emit the required delegate types.

When `Action<…>` or `Func<…>` would previously have been generated,
instead emit *and record the name of* a delegate which follows the
pattern:

  * Type name prefix: `_JniMarshal_PP`
  * Parameter types, using JNI encoding, e.g. `Z` for boolean,
    `I` for int, etc.  *Reference types*, normally encoded as `L…;`
    and Arrays, encoded as `[`, are each encoded as `L`.
    Kotlin unsigned types are encoded as *lower-case* forms of the
    corresponding JNI types, e.g. `i` is an unsigned `I`.
  * Another `_`.
  * The above type encoding for the return type.

For example, `Object.n_Equals_Ljava_lang_Object()` used
`Func<IntPtr, IntPtr, IntPtr, bool>`.  This would become
`_JniMarshal_PPL_Z`.

After the initial binding stage is complete and all required delegate
types are recorded, the `_JniMarshal*` types are emitted into
`__NamespaceMapping__.cs`:

	internal delegate bool _JniMarshal_PPL_Z (IntPtr jnienv, IntPtr klass, IntPtr a);

The cost to declaring all these types is that a binding assembly
contains more types.  `Mono.Android.dll`, for example, grows ~20KB
in size from all the required delegate declarations, pre-linking.


~~ Other ~~

Remove `tools/generator/generator.sln` and replace it with a
`tools/generator/generator.slnf` solution filter file which makes it
easier to work with `generator` in Visual Studio by only loading
needed projects from `Java.Interop.sln`.


[0]: https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/design.html#compiling_loading_and_linking_native_methods
[1]: https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/design.html#resolving_native_method_names
[2]: https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html#RegisterNatives
[3]: https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/design.html#native_method_arguments
[4]: https://docs.microsoft.com/en-us/dotnet/framework/interop/marshaling-a-delegate-as-a-callback-method
[5]: https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.marshal.getfunctionpointerfordelegate?view=netcore-3.1
[6]: https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals%28java.lang.Object%29
[7]: https://github.com/xamarin/xamarin-android/blob/42822e0488185cdf4bca7c0bd05b21ad03dfbd7e/src/Mono.Android/Android.Runtime/JNINativeWrapper.cs#L34-L97
[8]: dotnet/runtime#32963
[9]: https://github.com/dotnet/csharplang/blob/master/proposals/function-pointers.md
  • Loading branch information
jpobst authored Apr 28, 2020
1 parent 0a77166 commit 56955d9
Show file tree
Hide file tree
Showing 195 changed files with 668 additions and 464 deletions.
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
using System;

[assembly:global::Android.Runtime.NamespaceMapping (Java = "java.lang", Managed="Java.Lang")]
[assembly:global::Android.Runtime.NamespaceMapping (Java = "xamarin.test.invalidnames", Managed="Xamarin.Test.Invalidnames")]

Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ public ISpannableInvoker (IntPtr handle, JniHandleOwnership transfer) : base (Va
static Delegate GetGetSpanFlags_Ljava_lang_Object_Handler ()
{
if (cb_getSpanFlags_Ljava_lang_Object_ == null)
cb_getSpanFlags_Ljava_lang_Object_ = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, IntPtr, int>) n_GetSpanFlags_Ljava_lang_Object_);
cb_getSpanFlags_Ljava_lang_Object_ = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPL_I) n_GetSpanFlags_Ljava_lang_Object_);
return cb_getSpanFlags_Ljava_lang_Object_;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ public ISpannedInvoker (IntPtr handle, JniHandleOwnership transfer) : base (Vali
static Delegate GetGetSpanFlags_Ljava_lang_Object_Handler ()
{
if (cb_getSpanFlags_Ljava_lang_Object_ == null)
cb_getSpanFlags_Ljava_lang_Object_ = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, IntPtr, int>) n_GetSpanFlags_Ljava_lang_Object_);
cb_getSpanFlags_Ljava_lang_Object_ = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPL_I) n_GetSpanFlags_Ljava_lang_Object_);
return cb_getSpanFlags_Ljava_lang_Object_;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ public unsafe SpannableString (string source)
static Delegate GetGetSpanFlags_Ljava_lang_Object_Handler ()
{
if (cb_getSpanFlags_Ljava_lang_Object_ == null)
cb_getSpanFlags_Ljava_lang_Object_ = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, IntPtr, int>) n_GetSpanFlags_Ljava_lang_Object_);
cb_getSpanFlags_Ljava_lang_Object_ = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPL_I) n_GetSpanFlags_Ljava_lang_Object_);
return cb_getSpanFlags_Ljava_lang_Object_;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ protected SpannableStringInternal (IntPtr javaReference, JniHandleOwnership tran
static Delegate GetGetSpanFlags_Ljava_lang_Object_Handler ()
{
if (cb_getSpanFlags_Ljava_lang_Object_ == null)
cb_getSpanFlags_Ljava_lang_Object_ = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, IntPtr, int>) n_GetSpanFlags_Ljava_lang_Object_);
cb_getSpanFlags_Ljava_lang_Object_ = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPL_I) n_GetSpanFlags_Ljava_lang_Object_);
return cb_getSpanFlags_Ljava_lang_Object_;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public IOnClickListenerInvoker (IntPtr handle, JniHandleOwnership transfer) : ba
static Delegate GetOnClick_Landroid_view_View_Handler ()
{
if (cb_onClick_Landroid_view_View_ == null)
cb_onClick_Landroid_view_View_ = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, IntPtr>) n_OnClick_Landroid_view_View_);
cb_onClick_Landroid_view_View_ = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPL_V) n_OnClick_Landroid_view_View_);
return cb_onClick_Landroid_view_View_;
}

Expand Down Expand Up @@ -154,7 +154,7 @@ protected View (IntPtr javaReference, JniHandleOwnership transfer) : base (javaR
static Delegate GetSetOnClickListener_Landroid_view_View_OnClickListener_Handler ()
{
if (cb_setOnClickListener_Landroid_view_View_OnClickListener_ == null)
cb_setOnClickListener_Landroid_view_View_OnClickListener_ = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, IntPtr>) n_SetOnClickListener_Landroid_view_View_OnClickListener_);
cb_setOnClickListener_Landroid_view_View_OnClickListener_ = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPL_V) n_SetOnClickListener_Landroid_view_View_OnClickListener_);
return cb_setOnClickListener_Landroid_view_View_OnClickListener_;
}

Expand Down Expand Up @@ -184,7 +184,7 @@ public virtual unsafe void SetOnClickListener (Android.Views.View.IOnClickListen
static Delegate GetSetOn123Listener_Landroid_view_View_OnClickListener_Handler ()
{
if (cb_setOn123Listener_Landroid_view_View_OnClickListener_ == null)
cb_setOn123Listener_Landroid_view_View_OnClickListener_ = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, IntPtr>) n_SetOn123Listener_Landroid_view_View_OnClickListener_);
cb_setOn123Listener_Landroid_view_View_OnClickListener_ = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPL_V) n_SetOn123Listener_Landroid_view_View_OnClickListener_);
return cb_setOn123Listener_Landroid_view_View_OnClickListener_;
}

Expand Down Expand Up @@ -214,7 +214,7 @@ public virtual unsafe void SetOn123Listener (Android.Views.View.IOnClickListener
static Delegate GetAddTouchables_Ljava_util_ArrayList_Handler ()
{
if (cb_addTouchables_Ljava_util_ArrayList_ == null)
cb_addTouchables_Ljava_util_ArrayList_ = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, IntPtr>) n_AddTouchables_Ljava_util_ArrayList_);
cb_addTouchables_Ljava_util_ArrayList_ = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPL_V) n_AddTouchables_Ljava_util_ArrayList_);
return cb_addTouchables_Ljava_util_ArrayList_;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
using System;

[assembly:global::Android.Runtime.NamespaceMapping (Java = "android.view", Managed="Android.Views")]
[assembly:global::Android.Runtime.NamespaceMapping (Java = "android.text", Managed="Android.Text")]
[assembly:global::Android.Runtime.NamespaceMapping (Java = "java.lang", Managed="Java.Lang")]

delegate int _JniMarshal_PPL_I (IntPtr jnienv, IntPtr klass, IntPtr p0);
delegate void _JniMarshal_PPL_V (IntPtr jnienv, IntPtr klass, IntPtr p0);
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public ISpannableInvoker (IntPtr handle, JniHandleOwnership transfer) : base (Va
static Delegate GetGetSpanFlags_Ljava_lang_Object_Handler ()
{
if (cb_getSpanFlags_Ljava_lang_Object_ == null)
cb_getSpanFlags_Ljava_lang_Object_ = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, IntPtr, int>) n_GetSpanFlags_Ljava_lang_Object_);
cb_getSpanFlags_Ljava_lang_Object_ = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPL_I) n_GetSpanFlags_Ljava_lang_Object_);
return cb_getSpanFlags_Ljava_lang_Object_;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public ISpannedInvoker (IntPtr handle, JniHandleOwnership transfer) : base (Vali
static Delegate GetGetSpanFlags_Ljava_lang_Object_Handler ()
{
if (cb_getSpanFlags_Ljava_lang_Object_ == null)
cb_getSpanFlags_Ljava_lang_Object_ = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, IntPtr, int>) n_GetSpanFlags_Ljava_lang_Object_);
cb_getSpanFlags_Ljava_lang_Object_ = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPL_I) n_GetSpanFlags_Ljava_lang_Object_);
return cb_getSpanFlags_Ljava_lang_Object_;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ public unsafe SpannableString (string source)
static Delegate GetGetSpanFlags_Ljava_lang_Object_Handler ()
{
if (cb_getSpanFlags_Ljava_lang_Object_ == null)
cb_getSpanFlags_Ljava_lang_Object_ = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, IntPtr, int>) n_GetSpanFlags_Ljava_lang_Object_);
cb_getSpanFlags_Ljava_lang_Object_ = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPL_I) n_GetSpanFlags_Ljava_lang_Object_);
return cb_getSpanFlags_Ljava_lang_Object_;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ protected SpannableStringInternal (IntPtr javaReference, JniHandleOwnership tran
static Delegate GetGetSpanFlags_Ljava_lang_Object_Handler ()
{
if (cb_getSpanFlags_Ljava_lang_Object_ == null)
cb_getSpanFlags_Ljava_lang_Object_ = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, IntPtr, int>) n_GetSpanFlags_Ljava_lang_Object_);
cb_getSpanFlags_Ljava_lang_Object_ = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPL_I) n_GetSpanFlags_Ljava_lang_Object_);
return cb_getSpanFlags_Ljava_lang_Object_;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ public IOnClickListenerInvoker (IntPtr handle, JniHandleOwnership transfer) : ba
static Delegate GetOnClick_Landroid_view_View_Handler ()
{
if (cb_onClick_Landroid_view_View_ == null)
cb_onClick_Landroid_view_View_ = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, IntPtr>) n_OnClick_Landroid_view_View_);
cb_onClick_Landroid_view_View_ = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPL_V) n_OnClick_Landroid_view_View_);
return cb_onClick_Landroid_view_View_;
}

Expand Down Expand Up @@ -141,7 +141,7 @@ protected View (IntPtr javaReference, JniHandleOwnership transfer) : base (javaR
static Delegate GetSetOnClickListener_Landroid_view_View_OnClickListener_Handler ()
{
if (cb_setOnClickListener_Landroid_view_View_OnClickListener_ == null)
cb_setOnClickListener_Landroid_view_View_OnClickListener_ = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, IntPtr>) n_SetOnClickListener_Landroid_view_View_OnClickListener_);
cb_setOnClickListener_Landroid_view_View_OnClickListener_ = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPL_V) n_SetOnClickListener_Landroid_view_View_OnClickListener_);
return cb_setOnClickListener_Landroid_view_View_OnClickListener_;
}

Expand Down Expand Up @@ -177,7 +177,7 @@ public virtual unsafe void SetOnClickListener (Android.Views.View.IOnClickListen
static Delegate GetSetOn123Listener_Landroid_view_View_OnClickListener_Handler ()
{
if (cb_setOn123Listener_Landroid_view_View_OnClickListener_ == null)
cb_setOn123Listener_Landroid_view_View_OnClickListener_ = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, IntPtr>) n_SetOn123Listener_Landroid_view_View_OnClickListener_);
cb_setOn123Listener_Landroid_view_View_OnClickListener_ = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPL_V) n_SetOn123Listener_Landroid_view_View_OnClickListener_);
return cb_setOn123Listener_Landroid_view_View_OnClickListener_;
}

Expand Down Expand Up @@ -213,7 +213,7 @@ public virtual unsafe void SetOn123Listener (Android.Views.View.IOnClickListener
static Delegate GetAddTouchables_Ljava_util_ArrayList_Handler ()
{
if (cb_addTouchables_Ljava_util_ArrayList_ == null)
cb_addTouchables_Ljava_util_ArrayList_ = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, IntPtr>) n_AddTouchables_Ljava_util_ArrayList_);
cb_addTouchables_Ljava_util_ArrayList_ = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPL_V) n_AddTouchables_Ljava_util_ArrayList_);
return cb_addTouchables_Ljava_util_ArrayList_;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
using System;

[assembly:global::Android.Runtime.NamespaceMapping (Java = "android.view", Managed="Android.Views")]
[assembly:global::Android.Runtime.NamespaceMapping (Java = "android.text", Managed="Android.Text")]
[assembly:global::Android.Runtime.NamespaceMapping (Java = "java.lang", Managed="Java.Lang")]

delegate int _JniMarshal_PPL_I (IntPtr jnienv, IntPtr klass, IntPtr p0);
delegate void _JniMarshal_PPL_V (IntPtr jnienv, IntPtr klass, IntPtr p0);
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ static Delegate cb_GetCountForKey_Ljava_lang_String_;
static Delegate GetGetCountForKey_Ljava_lang_String_Handler ()
{
if (cb_GetCountForKey_Ljava_lang_String_ == null)
cb_GetCountForKey_Ljava_lang_String_ = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, IntPtr, int>) n_GetCountForKey_Ljava_lang_String_);
cb_GetCountForKey_Ljava_lang_String_ = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPL_I) n_GetCountForKey_Ljava_lang_String_);
return cb_GetCountForKey_Ljava_lang_String_;
}

Expand Down Expand Up @@ -34,7 +34,7 @@ static Delegate cb_Key;
static Delegate GetKeyHandler ()
{
if (cb_Key == null)
cb_Key = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, IntPtr>) n_Key);
cb_Key = JNINativeWrapper.CreateDelegate ((_JniMarshal_PP_L) n_Key);
return cb_Key;
}

Expand All @@ -58,7 +58,7 @@ static Delegate cb_AbstractMethod;
static Delegate GetAbstractMethodHandler ()
{
if (cb_AbstractMethod == null)
cb_AbstractMethod = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr>) n_AbstractMethod);
cb_AbstractMethod = JNINativeWrapper.CreateDelegate ((_JniMarshal_PP_V) n_AbstractMethod);
return cb_AbstractMethod;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ static Delegate cb_GetCountForKey_Ljava_lang_String_;
static Delegate GetGetCountForKey_Ljava_lang_String_Handler ()
{
if (cb_GetCountForKey_Ljava_lang_String_ == null)
cb_GetCountForKey_Ljava_lang_String_ = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, IntPtr, int>) n_GetCountForKey_Ljava_lang_String_);
cb_GetCountForKey_Ljava_lang_String_ = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPL_I) n_GetCountForKey_Ljava_lang_String_);
return cb_GetCountForKey_Ljava_lang_String_;
}

Expand Down Expand Up @@ -34,7 +34,7 @@ static Delegate cb_Key;
static Delegate GetKeyHandler ()
{
if (cb_Key == null)
cb_Key = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, IntPtr>) n_Key);
cb_Key = JNINativeWrapper.CreateDelegate ((_JniMarshal_PP_L) n_Key);
return cb_Key;
}

Expand All @@ -58,7 +58,7 @@ static Delegate cb_AbstractMethod;
static Delegate GetAbstractMethodHandler ()
{
if (cb_AbstractMethod == null)
cb_AbstractMethod = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr>) n_AbstractMethod);
cb_AbstractMethod = JNINativeWrapper.CreateDelegate ((_JniMarshal_PP_V) n_AbstractMethod);
return cb_AbstractMethod;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ static Delegate cb_get_Count;
static Delegate Getget_CountHandler ()
{
if (cb_get_Count == null)
cb_get_Count = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, int>) n_get_Count);
cb_get_Count = JNINativeWrapper.CreateDelegate ((_JniMarshal_PP_I) n_get_Count);
return cb_get_Count;
}

Expand All @@ -19,7 +19,7 @@ static Delegate cb_set_Count_I;
static Delegate Getset_Count_IHandler ()
{
if (cb_set_Count_I == null)
cb_set_Count_I = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, int>) n_set_Count_I);
cb_set_Count_I = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPI_V) n_set_Count_I);
return cb_set_Count_I;
}

Expand Down Expand Up @@ -52,7 +52,7 @@ static Delegate cb_get_Key;
static Delegate Getget_KeyHandler ()
{
if (cb_get_Key == null)
cb_get_Key = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, IntPtr>) n_get_Key);
cb_get_Key = JNINativeWrapper.CreateDelegate ((_JniMarshal_PP_L) n_get_Key);
return cb_get_Key;
}

Expand All @@ -68,7 +68,7 @@ static Delegate cb_set_Key_Ljava_lang_String_;
static Delegate Getset_Key_Ljava_lang_String_Handler ()
{
if (cb_set_Key_Ljava_lang_String_ == null)
cb_set_Key_Ljava_lang_String_ = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, IntPtr>) n_set_Key_Ljava_lang_String_);
cb_set_Key_Ljava_lang_String_ = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPL_V) n_set_Key_Ljava_lang_String_);
return cb_set_Key_Ljava_lang_String_;
}

Expand Down Expand Up @@ -104,7 +104,7 @@ static Delegate cb_get_StaticCount;
static Delegate Getget_StaticCountHandler ()
{
if (cb_get_StaticCount == null)
cb_get_StaticCount = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, int>) n_get_StaticCount);
cb_get_StaticCount = JNINativeWrapper.CreateDelegate ((_JniMarshal_PP_I) n_get_StaticCount);
return cb_get_StaticCount;
}

Expand All @@ -120,7 +120,7 @@ static Delegate cb_set_StaticCount_I;
static Delegate Getset_StaticCount_IHandler ()
{
if (cb_set_StaticCount_I == null)
cb_set_StaticCount_I = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, int>) n_set_StaticCount_I);
cb_set_StaticCount_I = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPI_V) n_set_StaticCount_I);
return cb_set_StaticCount_I;
}

Expand Down Expand Up @@ -153,7 +153,7 @@ static Delegate cb_get_AbstractCount;
static Delegate Getget_AbstractCountHandler ()
{
if (cb_get_AbstractCount == null)
cb_get_AbstractCount = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, int>) n_get_AbstractCount);
cb_get_AbstractCount = JNINativeWrapper.CreateDelegate ((_JniMarshal_PP_I) n_get_AbstractCount);
return cb_get_AbstractCount;
}

Expand All @@ -169,7 +169,7 @@ static Delegate cb_set_AbstractCount_I;
static Delegate Getset_AbstractCount_IHandler ()
{
if (cb_set_AbstractCount_I == null)
cb_set_AbstractCount_I = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, int>) n_set_AbstractCount_I);
cb_set_AbstractCount_I = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPI_V) n_set_AbstractCount_I);
return cb_set_AbstractCount_I;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ static Delegate cb_get_Key;
static Delegate Getget_KeyHandler ()
{
if (cb_get_Key == null)
cb_get_Key = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, IntPtr>) n_get_Key);
cb_get_Key = JNINativeWrapper.CreateDelegate ((_JniMarshal_PP_L) n_get_Key);
return cb_get_Key;
}

Expand All @@ -19,7 +19,7 @@ static Delegate cb_set_Key_Ljava_lang_String_;
static Delegate Getset_Key_Ljava_lang_String_Handler ()
{
if (cb_set_Key_Ljava_lang_String_ == null)
cb_set_Key_Ljava_lang_String_ = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, IntPtr>) n_set_Key_Ljava_lang_String_);
cb_set_Key_Ljava_lang_String_ = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPL_V) n_set_Key_Ljava_lang_String_);
return cb_set_Key_Ljava_lang_String_;
}

Expand Down Expand Up @@ -55,7 +55,7 @@ static Delegate cb_get_StaticCount;
static Delegate Getget_StaticCountHandler ()
{
if (cb_get_StaticCount == null)
cb_get_StaticCount = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, int>) n_get_StaticCount);
cb_get_StaticCount = JNINativeWrapper.CreateDelegate ((_JniMarshal_PP_I) n_get_StaticCount);
return cb_get_StaticCount;
}

Expand All @@ -71,7 +71,7 @@ static Delegate cb_set_StaticCount_I;
static Delegate Getset_StaticCount_IHandler ()
{
if (cb_set_StaticCount_I == null)
cb_set_StaticCount_I = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, int>) n_set_StaticCount_I);
cb_set_StaticCount_I = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPI_V) n_set_StaticCount_I);
return cb_set_StaticCount_I;
}

Expand Down Expand Up @@ -104,7 +104,7 @@ static Delegate cb_get_AbstractCount;
static Delegate Getget_AbstractCountHandler ()
{
if (cb_get_AbstractCount == null)
cb_get_AbstractCount = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, int>) n_get_AbstractCount);
cb_get_AbstractCount = JNINativeWrapper.CreateDelegate ((_JniMarshal_PP_I) n_get_AbstractCount);
return cb_get_AbstractCount;
}

Expand All @@ -120,7 +120,7 @@ static Delegate cb_set_AbstractCount_I;
static Delegate Getset_AbstractCount_IHandler ()
{
if (cb_set_AbstractCount_I == null)
cb_set_AbstractCount_I = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, int>) n_set_AbstractCount_I);
cb_set_AbstractCount_I = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPI_V) n_set_AbstractCount_I);
return cb_set_AbstractCount_I;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ static Delegate cb_get_MyProperty;
static Delegate Getget_MyPropertyHandler ()
{
if (cb_get_MyProperty == null)
cb_get_MyProperty = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, int>) n_get_MyProperty);
cb_get_MyProperty = JNINativeWrapper.CreateDelegate ((_JniMarshal_PP_I) n_get_MyProperty);
return cb_get_MyProperty;
}

Expand All @@ -19,7 +19,7 @@ static Delegate cb_set_MyProperty_I;
static Delegate Getset_MyProperty_IHandler ()
{
if (cb_set_MyProperty_I == null)
cb_set_MyProperty_I = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, int>) n_set_MyProperty_I);
cb_set_MyProperty_I = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPI_V) n_set_MyProperty_I);
return cb_set_MyProperty_I;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ static Delegate cb_get_MyProperty;
static Delegate Getget_MyPropertyHandler ()
{
if (cb_get_MyProperty == null)
cb_get_MyProperty = JNINativeWrapper.CreateDelegate ((Func<IntPtr, IntPtr, int>) n_get_MyProperty);
cb_get_MyProperty = JNINativeWrapper.CreateDelegate ((_JniMarshal_PP_I) n_get_MyProperty);
return cb_get_MyProperty;
}

Expand All @@ -19,7 +19,7 @@ static Delegate cb_set_MyProperty_I;
static Delegate Getset_MyProperty_IHandler ()
{
if (cb_set_MyProperty_I == null)
cb_set_MyProperty_I = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, int>) n_set_MyProperty_I);
cb_set_MyProperty_I = JNINativeWrapper.CreateDelegate ((_JniMarshal_PPI_V) n_set_MyProperty_I);
return cb_set_MyProperty_I;
}

Expand Down
Loading

0 comments on commit 56955d9

Please sign in to comment.