340 likes | 491 Views
Using Java interop in your Xamarin.Android apps. @ WMeints. Agenda. Java interop … wait what!? Beyond basic interop Building your own interop components. Java interop , wait what?!. Java interop , what what ?!. Building an Android app in C#. namespace TaskTracker.Client.Android
E N D
Agenda • Java interop… wait what!? • Beyond basic interop • Building your own interop components
Java interop, what what?! • Building an Android app in C# namespaceTaskTracker.Client.Android { [Activity(Label = "TaskTracker.Client.Android", MainLauncher = true, Icon = "@drawable/icon")] publicclassActivity1 : ListActivity { privateTasksOfflineContext _context; protectedoverridevoidOnCreate(Bundlebundle) { base.OnCreate(bundle); _context = newTasksOfflineContext("sync", newUri("http://10.0.2.2:15314/taskssyncservice.svc/")); _context.CacheController.ControllerBehavior.SerializationFormat = SerializationFormat.ODataJSON; _context.CacheController.RefreshCompleted += OnRefreshCompleted; _context.CacheController.RefreshAsync(); }
Java interop, what what?! • Meanwhile in Java country… public class Activity1 extendsandroid.app.ListActivityimplementsmono.android.IGCUserPeer { staticfinal String __md_methods; static { __md_methods = "n_onCreate:(Landroid/os/Bundle;)V:GetOnCreate_Landroid_os_Bundle_Handler\n" + ""; mono.android.Runtime.register ("TaskTracker.Client.Android.Activity1, “ + “TaskTracker.Client.Android, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", Activity1.class, __md_methods); } public Activity1 () { super (); if (getClass () == Activity1.class) mono.android.TypeManager.Activate ("TaskTracker.Client.Android.Activity1, “ + “TaskTracker.Client.Android, Version=1.0.0.0, Culture=neutral, “ … Cross Platform Mobile Development - Android
Java interop, what what?! Mono callable wrappers MCW .NET APIs Android.* AndroidBindings Java.* ACW Mono (.NET Runtime) Dalvik (Java Runtime) Linux Kernel Android callable wrappers
Java interop, wait what?! • What you are essentially doing is building apps that rely heavily upon interop. • In fact: Everything you build on Android will at some point talk to a piece Java code. Cross Platform Mobile Development - Android
Java interop, wait what?! • So why not take advantage of the situation? • You can extend your app with Java code • Found a cool Android library? Bind it! Cross Platform Mobile Development - Android
Beyond basic interop • The two-way traffic between Android and Mono is done through two endpoints: • Mono Java Mono Callable Wrappers • Java Mono Android Callable Wrappers Cross Platform Mobile Development - Android
Beyond basic interop - MCWs MCW .NET APIs Android.* AndroidBindings Java.* ACW Mono (.NET Runtime) Dalvik (Java Runtime) Linux Kernel
Beyond basic interop – MCWs • Talking to Java from .NET is done through the Java Native Interface • The next bit is going to get pointy or pointerific depending on what you like… Cross Platform Mobile Development - Android
Demo MCW Internals Cross Platform Mobile Development - Android
Beyond basic interop – MCWs • Steps to create an instance of a Java class • Find the handle to the type • Marshal constructor arguments • Invoke the constructor • Safe the instance pointer! Cross Platform Mobile Development - Android
Beyond basic interop – MCWs • Steps to invoke a Java method: • Find the handle to the method • Marshal the arguments • Invoke the method Cross Platform Mobile Development - Android
Beyond basic interop – MCWs • Notice the TransferOwnership settings • Important, who is the owner of the handle? • Care must be taken when transferring handles • If two objects own a handle, the app will be unstable! Cross Platform Mobile Development - Android
Beyond basic interop – MCWs • Important to know: • When invoking JNI, native handles are used • Has effect on garbage collection, so clean it up! • Please, Reduce the amount of memory copy actions, it will improve the performance. Cross Platform Mobile Development - Android
Beyond basic interop - ACWs MCW .NET APIs Android.* AndroidBindings Java.* ACW Mono (.NET Runtime) Dalvik (Java Runtime) Linux Kernel
Demo ACW Internals Cross Platform Mobile Development - Android
Beyond basic interop - ACWs • Android callable wrappers are the least of your problems. • Generated by the Mono compiler • Don’t touch or you will break them! Cross Platform Mobile Development - Android
Performance considerations • A few things you need to know: • Value types are copied between Java and Mono • For reference types pointers are exchanged • 4 bytes in .NET != 4 bytes in Java, sometimes Beware Bitmap users! Cross Platform Mobile Development - Android
Building your own interop • Explicit use of interop is possible from your own app through these methods: • Add Java source files to your project • Create bindings for an existing library Cross Platform Mobile Development - Android
Adding Java sources • Add a .java file to your project for • You found an activity or service that you don’t want to translate to .NET code • You have a single component, but not enough to create a library (Please keep it to one file). Cross Platform Mobile Development - Android
Demo Adding java sources Cross Platform Mobile Development - Android
Binding Java libraries • This is the real stuff, the big one, the goodest. • Allows you to use existing libraries • Automatically generates wrappers for Java classes based on the settings you provide. Cross Platform Mobile Development - Android
Binding Java libraries • The steps for binding a Java library: • Add the Java library to the binding project • Customize the transformations • Extend the library with your own goodies Cross Platform Mobile Development - Android
Binding Java libraries • The steps for binding a Java library: • Add the Java library to the binding project • Customize the transformations • Extend the library with your own goodies Cross Platform Mobile Development - Android
Demo Binding A java library Cross Platform Mobile Development - Android
Binding Java libraries • The steps for binding a Java library: • Add the Java library to the binding project • Customize the transformations • Extend the library with your own goodies Cross Platform Mobile Development - Android
Demo Customizing transformations Cross Platform Mobile Development - Android
Binding Java libraries • The steps for binding a Java library: • Add the Java library to the binding project • Customize the transformations • Extend the library with your own goodies Cross Platform Mobile Development - Android
Demo Extending bindings Cross Platform Mobile Development - Android
Final thoughts • Java interop is all around you in Xamarin.Android • Don’t worry too much about it in your day-to-day Android development. • Use it when you need it, to get more power! Cross Platform Mobile Development - Android