How to run Jar libraries on Xamarin.Android
前回 Android Studioで作ったjarライブラリーファイルをAndroid向けXamarinで実行します。
環境
- Windows 10
- Visual Studio Community 2015
既存のAndroid用ソリューションに Bindings Library を追加する
XamarinでJarライブラリーを実行するために Bindings Library プロジェクトを追加します。Visual Studioを起動してAndroidアプリ用ソリューションを開きます。
ソリューションエクスプローラーのソリューションを右クリックして
追加 - 新しいプロジェクト
をクリックします。
Bindings Library (Android) を追加します。
名前は BindingFujiuJar としました。
これでソリューションに BindingFujiuJar が追加されました。
Bindings Library プロジェクトにjarファイルを追加する
今回実行するjarファイルの中は StringDate というクラスに getNow() というメソッドがあります。 ソースはこちらBindingFujiuJar の Jars フォルダーを右クリックして
追加 - 既存の項目
をクリックしてAndroid Studioで作ってjarファイルを追加します。
追加したjarファイルのプロパティのビルドアクションを EmbeddedJar に変更します。
今回のjarライブラリー化したクラスは Try-with-resources を使っているので、Xamarin.Androidプロジェクトのプロパティーの Compile using Android Versions を19以上に設定する必要がありました。
Android SDKの最新版をダウンロードし、「Use Latest Platoform」にしておきました。
既存のAndroid用プロジェクトの参照を設定する
Android用プロジェクト (先ほど追加したBindings Libraryではない方) の参照を右クリックして 参照の追加 をクリックします。プロジェクト内にある先ほど追加した BindingFujiuJar をチェックしてOKをクリックします。
これで準備が整いました。
C#のクラスからJavaのjarライブラリーのクラスを実行する
オブジェクトブラウザーでJavaのパッケージ名はC#の名前空間に変換された結果を確認します。jp.fujiu.fujiujp_jar
というJavaパッケージ名は
JP.Fujiu.Fujiujp_jar
という名前空間に変換されました。
C#のコーディングスタイルに合わせて1文字目とピリオドの次は大文字で書くとして、2文字目のPも大文字に変換されました。
またJavaの getNow() というメソッド(アクセサー)はC#の Now というプロパティに変換されます。
JavaのStringDateクラスのgetNow()メソッドを呼び出すActivityをXamarinのC#で書いてみました。
ボタンをクリックするたびに結果をToastに表示するActivityの例です。
実行結果
Docomo SH-06E (Android4.2、APIレベル17)で正常に実行できました。Xamarin.Formsソリューションでは .Droidプロジェクトから実行することができました。
まとめ
- jarファイルのビルドアクションはEmbeddedJarに設定する
- Javaのパッケージ名はC#の名前空間に変換される。一部大文字に変換されるので注意
- Javaのgetやsetで始まるメソッド(アクセサー)はC#のプロパティに置き換えられる
例: getNow() → Now
注意点
C#からJavaのコードを実行するのにリフレクションを使っているようです。リフレクションは非リフレクションと比較すると遅い実行方法なので速さが求められる処理には向きません。
C#への移植が困難で速さを犠牲にしてもいい場合以外は使用を控えた方が良さそうです。
トラブルシューティング
実行時に JNIEnv.FindClass ClassNotFoundException が発生する
プロジェクトのクリーンとビルドをし直したら発生しなくなりました。関連ブログ
[Android Studio] Xamarin で実行可能な jar (Javaライブラリー) の作り方[Android] Xamarin でアプリを作ってみました
Android Studioを使ってみました
[Unity3D] Unity5のプロジェクトをAndroid Studioにインポートする方法
[Java] Android StudioやEclipseのお節介な警告を消す方法
[Android] アナログ時計アプリをライブ壁紙に改造する
以上、参考になれば幸いです。