2016年6月25日土曜日

[Android] Xamarin で jar (Javaライブラリー) を実行する方法

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アプリ用ソリューションを開きます。
ソリューションエクスプローラーのソリューションを右クリックして
追加 - 新しいプロジェクト
をクリックします。
blog.fujiu.jp [Android] Xamarin で jar (Javaライブラリー) を実行する方法

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] アナログ時計アプリをライブ壁紙に改造する

以上、参考になれば幸いです。

0 件のコメント:

コメントを投稿