Xamarin.Android で Java Integration ライブラリを作る

Xamarin では、広告・分析やUIなどの機能を提供するネイティブSDK(Java/NDK)も使用することができます。.NET用のライブラリだけでなく、ネイティブのライブラリが選択肢に入ることで、より多くの可能性を引き出すことができます。

ネイティブのライブラリを使用するには、バインディングライブラリというものを作ってラップする必要があります。この記事では Xamarin.AndroidJavaバインディングライブラリを作る方法をご紹介します。

今回は題材として Google Anaytics SDK for Android v3 を使用しますが、このライブラリは Xamarin Components に存在していてそのまま使用することができます。

バインディングプロジェクトの作成

Xamarin Studio の新規作成画面で AndroidAndroid Java Bindings Library を作成します。このとき、プロジェクト名に . を含めないようにしてください。

スクリーンショット 2014-06-09 20.00.12.png

Android ライブラリの追加

できたプロジェクトのJarsフォルダに、Java バインディングするライブラリを追加します。

スクリーンショット 2014-06-09 20.02.57 2014-06-09 20-03-41 2014-06-09 20-04-17.png

このままビルドすることで、特に問題がない場合はそのままビルドすることができ、Java のオブジェクトを.NETのオブジェクトにマップしたライブラリが生成されます。

クラスの出力調整

Jade でできるいくつかの定義はそのまま .NET とは適合しません。このため、マップの処理をカスタマイズできる仕組みが用意されています。Transformsフォルダに入っているXMLファイルに定義を追加することでカスタマイズを行うことができます。

今回は、Transforms/Metadata.xml に下記の定義を追加しました。

<metadata>
  <remove-node path="/api/package[@name!='com.google.analytics.tracking.android']" />
  <attr path="/api/package[@name='com.google.analytics.tracking.android']/class[@name='GoogleAnalytics']" name="extends">java.lang.Object</attr>
</metadata>

今回はBug 15005 – Trouble Binding Google Analytics for Mobile JAR ("already contains a definition for...")を参考に定義しましたが、実際はエラーや警告を読みながら対応する必要があります。

指定の方法のリファレンスは[API Metadata Reference | Xamarin] (http://developer.xamarin.com/guides/android/advanced_topics/java_integration_overview/binding_a_java_library_%28.jar%29/api_metadata_reference/)にあります。

おわりに

Xamarin.Android でもネイティブバインディングを使用すれば広告や3Dなど、様々なライブラリを使えるので、是非活用してください。

簡単なものであればそれほど難しくないですが、Transform でのカスタマイズが必要になるとだいぶコツが必要になってしまいます。僕もよくわかってないので、誰かもっと詳細に補足していただけるとうれしいです。