Android 用のサードパーティ製ライブラリ エコシステムは巨大です。 このため、新しい Android ライブラリを作成するよりも、既存の Android ライブラリを使用することがよくあります。
.NET for Android では、C# ラッパーでライブラリを自動的にラップする Bindings Library を使用してこれを行うことができるため、C# 呼び出しを介して Java コードを呼び出すことができます。
これは、 Managed Callable Wrappers (MCW) を使用して実装されます。 MCW は、マネージド コードで Java コードを呼び出す必要がある場合に使用される JNI ブリッジです。 マネージド呼び出し可能ラッパーは、Java 型のサブクラス化と Java 型の仮想メソッドのオーバーライドもサポートしています。 同様に、Android ランタイム (ART) コードでマネージド コードを呼び出す必要がある場合は、Android 呼び出し可能ラッパー (ACW) と呼ばれる別の JNI ブリッジ経由で実行されます。 このアーキテクチャを次の図に示します。
バインド ライブラリは、Java 型用のマネージド呼び出し可能ラッパーを含むアセンブリです。 たとえば、次のような Java 型 MyClass をバインド ライブラリでラップするとします。
package com.contoso.mycode;
public class MyClass
{
public String myMethod (int i) { ... }
}
var instance = new MyClass ();
string result = instance.MyMethod (42);
このバインド ライブラリを作成するには、.NET for Android Android Java バインド ライブラリ テンプレートを使用します。 結果のバインド プロジェクトでは、MCW クラス、 .jar/.aar ファイル、および Android ライブラリ プロジェクトのリソースが埋め込まれた .NET アセンブリが作成されます。 結果のバインド ライブラリ アセンブリを参照することで、.NET for Android プロジェクトで既存の Java ライブラリを再利用できます。
バインド ライブラリ内の型を参照する場合は、バインド ライブラリの名前空間を使用する必要があります。 通常は、C# ソース ファイルの先頭に、Java パッケージ名の .NET 名前空間バージョンである using ディレクティブを追加します。 たとえば、バインドされた .jar の Java パッケージ名が次のようになっているとします。
com.contoso.package
その場合、C# ソース ファイルの先頭に次の using ステートメントを記述して、バインドされた .jar ファイル内の型にアクセスします。
using Com.Contoso.Package;
既存の Android ライブラリをバインドする場合は、次の点に注意する必要があります。
ライブラリに外部依存関係はあるか – Android ライブラリに必要な Java 依存関係は、NuGet パッケージを介して、または AndroidLibrary として .NET for Android プロジェクトに含める必要があります。 ネイティブ アセンブリは、バインド プロジェクトに AndroidNativeLibrary として追加する必要があります。
Android ライブラリのターゲットとなる Android API のバージョンは何か – Android API レベルを "ダウングレード" することはできません。.NET for Android バインド プロジェクトが Android ライブラリと同じ API レベル (またはそれ以上) をターゲットにしていることを確認します。
Java API を C⧣ に適合させる
.NET for Android バインド ジェネレーターでは、.NET パターンに対応するように、一部の Java のイディオムとパターンが変更されます。 次の一覧では、Java を C#/.NET にマップする方法について説明します。
Java の "セッター/ゲッター メソッド" は、.NET の "プロパティ" です。
Java の "フィールド" は、.NET の "プロパティ" です。
Java の "リスナー/リスナー インターフェイス" は、.NET の "イベント" です。 コールバック インターフェイスのメソッドのパラメーターは、
EventArgsサブクラスによって表されます。Java の "静的入れ子クラス" は、.NET の "入れ子クラス" です。
Java の "内部クラス" は、C# の インスタンス コンストラクターを持つ "入れ子クラス" です。
バインディングにネイティブ ライブラリを含む
Java ライブラリのバインドの一部として、.NET for Android バインド プロジェクトに .so ライブラリを含める必要がある場合があります。 ラップされた Java コードが実行されると、.NET for Android は JNI 呼び出しを行うことができず、エラー メッセージ java.lang.UnsatisfiedLinkError: Native メソッド not found: がアプリケーションの logcat out に表示されます。
これを解決するには、Java.Lang.JavaSystem.LoadLibrary を呼び出して .so ライブラリを手動で読み込みます。 たとえば、.NET for Android プロジェクトに共有ライブラリ libpocketsphinx_jni.soAndroidNativeLibrary のビルド アクションが含まれていると仮定すると、次のスニペット (共有ライブラリを使用する前に実行) によって、 .so ライブラリが読み込まれます。
Java.Lang.JavaSystem.LoadLibrary("pocketsphinx_jni");
バインドシナリオ
次のバインド シナリオ ガイドは、アプリに組み込むために Java ライブラリをバインドするのに役立ちます。
Java ライブラリのバインド は、ローカルで使用可能な .jar/.aar ファイルのバインド ライブラリを作成するためのチュートリアルです。
Maven から Java ライブラリをバインドする は、Maven リポジトリでホストされている .jar/.aar ファイルのバインド ライブラリを作成するためのチュートリアルです。
バインドのカスタマイズ では、ビルド エラーを解決し、結果の API をより "C#に似た" ように整形するために、バインドを手動で変更する方法について説明します。
バインディングのトラブルシューティング 一般的なバインディング エラーシナリオの一覧、考えられる原因の説明、およびこれらのエラーを解決するための推奨事項を示します。