[mono-android] Does anyone have a code example for using Google Market Licensing with MonoDroid?

Mark Eaton mark.eaton.me at gmail.com
Mon Jan 16 18:53:02 UTC 2012


I've started creating a C# helper class.

Using JNIEnv I can get the Android Device Id.

But I can't create an instance of ABESObfuscator. The signature looks right,
it's just when I create the instance.

The code below is more where I am up to.



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;

namespace MarketLicensing
{
    public class LicenseHelper
    {
        // Generate 20 random bytes, and put them here.
        private Java.Lang.Byte[] Salt = new Java.Lang.Byte[] 
        { 
            new Java.Lang.Byte(-46), 
            new Java.Lang.Byte(65), 
            new Java.Lang.Byte(30), 
            new Java.Lang.Byte(-128), 
            new Java.Lang.Byte(-103), 
            new Java.Lang.Byte(-57), 
            new Java.Lang.Byte(74), 
            new Java.Lang.Byte(-64), 
            new Java.Lang.Byte(51), 
            new Java.Lang.Byte(88), 
            new Java.Lang.Byte(-95), 
            new Java.Lang.Byte(-45), 
            new Java.Lang.Byte(77), 
            new Java.Lang.Byte(-117), 
            new Java.Lang.Byte(-36), 
            new Java.Lang.Byte(-113), 
            new Java.Lang.Byte(-11), 
            new Java.Lang.Byte(32), 
            new Java.Lang.Byte(-64), 
            new Java.Lang.Byte(89)
        };

        public LicenseHelper(MainActivity activity)
        {
            // Get Android Device Id
            var secure =
JNIEnv.FindClass("android/provider/Settings$Secure");
            var secureAndroidId = JNIEnv.GetStaticFieldID(secure,
"ANDROID_ID", "Ljava/lang/String;");
            var secureGetString = JNIEnv.GetStaticMethodID(secure,
"getString",
"(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;");
            var androidId = JNIEnv.GetStaticObjectField(secure,
secureAndroidId);
            var deviceId = JNIEnv.CallStaticObjectMethod(secure,
secureGetString, 
                new JValue[] { new JValue(activity.ContentResolver.Handle),
new JValue(androidId) });

             // Below line proves that I get the android device id
            //var aaa = JNIEnv.GetString(deviceId,
JniHandleOwnership.DoNotTransfer);

             // Below is the C# method for the above. Proves that the above
does work
            //var deviceId2 =
Android.Provider.Settings.Secure.GetString(activity.ContentResolver,
Android.Provider.Settings.Secure.AndroidId);
            
             //  Below line proves that I get the package name            
            ///var aaa = JNIEnv.GetString(new
Java.Lang.String(activity.PackageName).Handle,
JniHandleOwnership.DoNotTransfer);

            
            var licensing =
JNIEnv.FindClass("com/android/vending/licensing/LicenseChecker");
            var serverPolicy =
JNIEnv.FindClass("com/android/vending/licensing/ServerManagedPolicy");
            var aesObfuscator =
JNIEnv.FindClass("com/android/vending/licensing/AESObfuscator");
            var saltPointer = JNIEnv.NewArray(Salt);


            // Below line proves that I get the Java byte array back
            // var aaa = JNIEnv.GetArray<Java.Lang.Byte>(saltPointer);

            var aesObfuscatorConstructor = JNIEnv.GetMethodID(aesObfuscator,
"<init>", "([BLjava/lang/String;Ljava/lang/String;)V");


// THERE IS WHERE I AM STUCK!!!! 
// ALL THE ABOVE CODE WORKS BUT WHAT AM I DOING WRONG BELOW????
// WILL CRASH!!

            var aesObfuscatorInstance = JNIEnv.NewObject(
                aesObfuscator,
    aesObfuscatorConstructor,
                new JValue[] { new JValue(saltPointer), new JValue(new
Java.Lang.String(activity.PackageName).Handle), new JValue(deviceId) });


// Below is what I am ultimately converting            
            // Construct the LicenseChecker with a policy.
    //        mChecker = new LicenseChecker(
      //          this, new ServerManagedPolicy(this,
        //            new AESObfuscator(SALT, getPackageName(), deviceId)),
          //      BASE64_PUBLIC_KEY);
            //doCheck();


            // Clean up
            JNIEnv.DeleteLocalRef(aesObfuscatorInstance);
        }
    }
}


--
View this message in context: http://mono-for-android.1047100.n5.nabble.com/Does-anyone-have-a-code-example-for-using-Google-Market-Licensing-with-MonoDroid-tp5144555p5149556.html
Sent from the Mono for Android mailing list archive at Nabble.com.


More information about the Monodroid mailing list