1 / 34

Using Java interop in your Xamarin.Android apps

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

Download Presentation

Using Java interop in your Xamarin.Android apps

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Using Java interop in your Xamarin.Android apps @WMeints

  2. Agenda • Java interop… wait what!? • Beyond basic interop • Building your own interop components

  3. Java interop, wait what?!

  4. 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(); }

  5. 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

  6. 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

  7. 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

  8. 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

  9. Beyond basic interop

  10. 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

  11. Beyond basic interop - MCWs MCW .NET APIs Android.* AndroidBindings Java.* ACW Mono (.NET Runtime) Dalvik (Java Runtime) Linux Kernel

  12. 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

  13. Demo MCW Internals Cross Platform Mobile Development - Android

  14. 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

  15. 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

  16. 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

  17. 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

  18. Beyond basic interop - ACWs MCW .NET APIs Android.* AndroidBindings Java.* ACW Mono (.NET Runtime) Dalvik (Java Runtime) Linux Kernel

  19. Demo ACW Internals Cross Platform Mobile Development - Android

  20. 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

  21. 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

  22. Building your own interop

  23. 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

  24. 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

  25. Demo Adding java sources Cross Platform Mobile Development - Android

  26. 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

  27. 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

  28. 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

  29. Demo Binding A java library Cross Platform Mobile Development - Android

  30. 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

  31. Demo Customizing transformations Cross Platform Mobile Development - Android

  32. 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

  33. Demo Extending bindings Cross Platform Mobile Development - Android

  34. 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

More Related