rksoftware

Visual Studio とか C# とかが好きです

Android バインド ライブラリ を作る

先日、Android のサンプルコードを Xamarin.Android に書き換えてみた記事を書きました。

その際に長い戦いとなった Android バインド ライブラリ 作成について書いていきます。 今回は、1歩目 - プロジェクトを新規作成してアプリで使ってみる話です。

目次はこちら ↓

■ 必要なもの

今回の手順に必要なものは、

  • Java の開発環境または、手ごろな .jar ファイル
  • Xamarin の開発環境(この記事では Windows 環境でやってます)

です。

■ 事前準備 - .jar ファイルを作る

まず作ってみるということで要素を最小限にするためにシンプルな1メソッドの1クラスの .jar を作りました。

package com.example.sampleclasses;

public class JavaClass {
    public String getText(){ return "風が語りかけます."; }
}

.jar ファイル名は javaclasses.jar としています。

■ プロジェクト新規作成

Android バインド ライブラリ を新規作成します。
Visual Studio のプロジェクトの新規作成で、テンプレートから Android バインド ライブリ (Xamarin) を選択します。プロジェクト タイプ がライブラリでなく、モバイルである点に気を付けてください。

f:id:rksoftware:20190812162327j:plain

今回は、プロジェクト名を MyBindLibrary としてみました。

f:id:rksoftware:20190812162349j:plain

■ .jar ファイルをプロジェクトに追加

プロジェクト内のフォルダ Jars の中に .jar ファイルを追加します。

f:id:rksoftware:20190812162414j:plain

.jar ファイルを追加したら、ファイルのプロパティでビルドアクションを EmbeddedJar に変更します。
デフォルトの InputJar のままだと、実行時に Java.Lang.ClassNotFoundException が発生します。

f:id:rksoftware:20190812162426j:plain

ビルドすると、 .dll が出来上がりますが、何もしてないのに (Java コードも何もしていないレベルのシンプルなものなのに) 警告が出ます。
警告は、生成された .cs ファイルのコードの話なので内容をコードで確認できます。何もしてなくても警告がでますし今後も大量の警告がでるので、警告は無視して進めます。

f:id:rksoftware:20190812162531j:plain

■ Android アプリ プロジェクトを新規作成、バインド ライブラリを参照する

ソリューション内に、Android アプリ プロジェクトを新規作成し、作成きた MyBindLibrary バインド ライブラリ プロジェクトを参照します。
ここは、別ソリューションで .dll 参照にしても良いですが、この方が楽だと思います(※1点だけ後述の注意点があります)。

f:id:rksoftware:20190812162515j:plain

バインド ライブラリ 内のメンバーを使用する

今回は Java で com.example.sampleclasses.JavaClass クラスを作ったのでバインディング ライブラリには C# 的な命名の Com.Example.Sampleclasses.JavaClass クラスが作られています。また、getText メソッドも C# 的に Text プロパティになっています。
この Com.Example.Sampleclasses.JavaClass クラスの Text プロパティの値を画面表示するコードを書きます。

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    Xamarin.Essentials.Platform.Init(this, savedInstanceState);
    SetContentView(Resource.Layout.activity_main);

    var textView = FindViewById<TextView>(Resource.Id.textView);
    textView.Text = new Com.Example.Sampleclasses.JavaClass().Text;

このプロパティの値は "風が語りかけます." でした。

package com.example.sampleclasses;

public class JavaClass {
    public String getText(){ return "風が語りかけます."; }
}

■ 実行

実行すると、見事 風が語りかけます. と表示され、独自の .jar ファイルが Xamarin.Android で使えました!

■ 注意点 - 居るはずの .dll 内のメンバーが見えない

バインド ライブリ にどんなメンバーが含まれているかは、バインド ライブリ プロジェクトの \obj\Debug\generated\src\ ディレクトリ内の .cs ファイル群で確認できます。また、.dll に含まれているメンバーは、オブジェクト ブラウザで確認できます (メニューの 表示 > オブジェクト ブラウザー)。
これらを確認し、\obj\Debug\generated\src\ ディレクトリ内の .cs ファイル群に目的のメンバーがいるのにオブジェクト ブラウザやコンバイラ上は居ないことになっている場合は次の手順で正しくなります。

  • 該当の バインド ライブリ プロジェクト を一旦アンロード

\obj\Debug\generated\src\ ディレクトリの例

f:id:rksoftware:20190812162607j:plain

オブジェクト ブラウザの例

f:id:rksoftware:20190812162625j:plain

この事象に対し、リビルドや、クリーン > obj と bin を削除 > リビルド は無力です。

(つづく)