On Jan 19, 2012, at 4:58 PM, Mark Eaton wrote:
> Now I need to implement the call back based on a Java interface:
> "com/android/vending/licensing/LicenseCheckerCallback"

See the SanityTests sample:

        Java: 
https://github.com/xamarin/monodroid-samples/blob/master/SanityTests/Adder.java#L14
        C# binding: 
https://github.com/xamarin/monodroid-samples/blob/master/SanityTests/ManagedAdder.cs#L82

> // HOWEVER AM I IMPLEMENTING THE BELOW CODE CORRECTLY????
> // OR AM I WAY OFF TRACK??

You're partially off track. :-)

Your interface methods need to provide the Connector value, and methods don't 
require DoNotGenerateAcw:

        
[Android.Runtime.Register("com/android/vending/licensing/LicenseCheckerCallback",
 DoNotGenerateAcw = true)]
        public interface ILicenseCheckerCallback : IJavaObject
        {
                [Register("allow", "()V", 
"GetAllowHandler:Insert.Namespace.Here.ILicenseCheckerCallbackInvoker, AQN")]
                void Allow ();

                [Register("dontAlllow", "()V", 
"GetDoNotAllowHandler:Insert.Namespace.Here.ILicenseCheckerCallbackInvoker, 
AQN")]
                void DoNotAllow ();

                [Register("dontAlllow", "()V", 
"GetApplicationErrorHandler:Insert.Namespace.Here.ILicenseCheckerCallbackInvoker,
 AQN")]
                void ApplicationError (ApplicationErrorCode errorCode);
        }

"AQN" is the AssemblyQualifiedName for your assembly; see e.g.

        
https://github.com/xamarin/monodroid-samples/blob/master/SanityTests/ManagedAdder.cs#L84

Then  you need to bind the ApplicationErrorCode type (it's a class), akin to:

        [Register 
("com/android/vending/licensing/LicenseCheckerCallback$ApplicationErrorCode", 
DoNotGenerateAcw=true)]
        public class ApplicationErrorCode : Java.Lang.Object {
                /* ... */
                // Note: this must provide the (IntPtr, JniHandleOwnership) 
constructor
        }

Finally you need the interface Invoker, the ILicenseCheckerCallbackInvoker 
referenced above. The Invoker is responsible for implementing the interface (so 
that a Managed Callable Wrapper can be created for Java instances of the 
interface), and for providing the marshaling functions. For an example, see:

        
https://github.com/xamarin/monodroid-samples/blob/master/SanityTests/ManagedAdder.cs#L88

        class ILicenseCheckerCallbackInvoker : Java.Lang.Object, 
ILicenseCheckerCallback {
                // ...

        #region ApplicationError
                IntPtr id_applicationError;
                public void ApplicationError (ApplicationErrorCode errorCode)
                {
                        if (id_applicationError == IntPtr.Zero)
                                id_applicationError = 
JNIEnv.GetMethodID(class_ref, "applicationError",
                                                
"(Lcom/android/vending/licensing/LicenseCheckerCallback$ApplicationErrorCode)V");
                        JNIEnv.CallVoidMethod(Handle, id_applicationError, new 
JValue (errorCode));
                }

        #pragma warning disable 0169
                static Delegate cb_applicationError;
                static Delegate GetApplicationErrorHandler ()
                {
                        if (cb_applicationError == null)
                                cb_applicationError = 
JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, IntPtr>) 
n_ApplicationError);
                        return cb_applicationError;
                }

                static void n_ApplicationError (IntPtr jnienv, IntPtr lrefThis, 
IntPtr n_errorCode)
                {
                        ILicenseCheckerCallback __this = 
Java.Lang.Object.GetObject<ILicenseCheckerCallback>(lrefThis, 
JniHandleOwnership.DoNotTransfer);
                        using (var errorCode = 
Java.Lang.Object.GetObject<ApplicationErrorCode>(n_errorCode, 
JniHandleOwnership.DoNotTransfer))
                                __this.ApplicationError (errorCode);
                }
        #pragma warning restore 0169
        #endregion
                // ...
        }

Yes, supporting interfaces is ugly.

 - Jon

_______________________________________________
Monodroid mailing list
[email protected]

UNSUBSCRIBE INFORMATION:
http://lists.ximian.com/mailman/listinfo/monodroid

Reply via email to