Android
Xamarin

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

More than 5 years have passed since last update.

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

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

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


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

Xamarin Studio の新規作成画面で Android の Android 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.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にあります。


おわりに

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

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