Using java interop in your xamarin.android apps
-
Upload
willem-meints -
Category
Technology
-
view
1.151 -
download
2
description
Transcript of Using java interop in your xamarin.android apps
Using Java interop in your
Xamarin.Androidapps
@WMeints
AgendaJava 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{
[Activity(Label = "TaskTracker.Client.Android", MainLauncher = true, Icon = "@drawable/icon")]public class Activity1 : ListActivity{
private TasksOfflineContext _context;
protected override void OnCreate(Bundle bundle){
base.OnCreate(bundle);
_context = new TasksOfflineContext("sync", new Uri("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…
Cross Platform Mobile Development - Android
public class Activity1 extends android.app.ListActivity implements mono.android.IGCUserPeer{
static final 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, “ …
Java interop, what what?!
Linux Kernel
Mono (.NET Runtime) Dalvik (Java Runtime)
.NET APIsAndroidBindings
Android.* Java.*MCW
ACW
Android callable wrappers
Mono 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
Beyond basic interopThe two-way traffic between Android and Mono is done through two endpoints:
– Mono Java Mono Callable Wrappers
– JavaMono Android Callable Wrappers
Cross Platform Mobile Development - Android
Beyond basic interop - MCWs
Linux Kernel
Mono (.NET Runtime) Dalvik (Java Runtime)
.NET APIsAndroidBindings
Android.* Java.*MCW
ACW
Beyond basic interop – MCWsTalking to Java from .NET is done through the Java Native Interface
– The next bit is going to get pointy or pointerificdepending on what you like…
Cross Platform Mobile Development - Android
MCW INTERNALSDemo
Cross Platform Mobile Development - Android
Beyond basic interop – MCWsSteps 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 – MCWsSteps 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 – MCWsNotice 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 – MCWsImportant 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
Linux Kernel
Mono (.NET Runtime) Dalvik (Java Runtime)
.NET APIsAndroidBindings
Android.* Java.*MCW
ACW
ACW INTERNALSDemo
Cross Platform Mobile Development - Android
Beyond basic interop - ACWsAndroid 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 considerationsA 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
Cross Platform Mobile Development - Android
Beware Bitmap users!
BUILDING YOUR OWN INTEROP
Building your own interopExplicit 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 sourcesAdd 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
ADDING JAVA SOURCESDemo
Cross Platform Mobile Development - Android
Binding Java librariesThis 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 librariesThe steps for binding a Java library:
1. Add the Java library to the binding project
2. Customize the transformations
3. Extend the library with your own goodies
Cross Platform Mobile Development - Android
Binding Java librariesThe steps for binding a Java library:
1. Add the Java library to the binding project
2. Customize the transformations
3. Extend the library with your own goodies
Cross Platform Mobile Development - Android
BINDING A JAVA LIBRARYDemo
Cross Platform Mobile Development - Android
Binding Java librariesThe steps for binding a Java library:
1. Add the Java library to the binding project
2. Customize the transformations
3. Extend the library with your own goodies
Cross Platform Mobile Development - Android
CUSTOMIZING TRANSFORMATIONSDemo
Cross Platform Mobile Development - Android
Binding Java librariesThe steps for binding a Java library:
1. Add the Java library to the binding project
2. Customize the transformations
3. Extend the library with your own goodies
Cross Platform Mobile Development - Android
EXTENDING BINDINGSDemo
Cross Platform Mobile Development - Android
Final thoughtsJava 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