Java 函式庫綁定

Android 的第三方連結庫生態系統非常龐大。 因此,使用現有的 Android 連結庫通常比建立新的連結庫有意義。

適用於 Android 的 .NET 可讓您使用 系結連結庫 來執行此動作,以使用 C# 包裝函式自動包裝連結庫,以便您可以透過 C# 呼叫叫用 Java 程式代碼。

這是透過使用 管理式可呼叫包裝器MCW)來實作的。 MCW 是一個 JNI 橋接器,當受控代碼需要呼叫 Java 代碼時使用。 受控呼叫包裝函式還支援對 Java 類型的子類化及覆寫虛擬方法。 同樣地,每當 Android 執行環境(ART)需要呼叫受管理的程式代碼時,它會透過另一個稱為 Android 包裝函數 (ACW) 的 JNI 網橋來執行。 下圖說明此架構:

Android JNI 網橋架構

繫結庫是一個包含 Java 類型的受控可呼叫包裝器的組件。 例如,以下是我們想要在繫結庫中封裝的 Java 類型 MyClass

package com.contoso.mycode;

public class MyClass
{
    public String myMethod (int i) { ... }
}

針對包含MyClass.jar 產生系結庫之後,我們可以從 C# 將它具現化並呼叫方法:

var instance = new MyClass ();

string result = instance.MyMethod (42);

若要建立此系結連結庫,您可以使用適用於 Android Android Java 系結連結庫 的 .NET 範本。 產生的系結專案會建立使用MCW類別、.jar/.aar檔案,以及內嵌在其中之Android Library專案資源的 .NET 元件。 藉由參考產生的系結連結庫元件,您可以在 .NET for Android 專案中重複使用現有的 Java 連結庫。

當您在系結連結庫中參考類型時,必須使用系結連結庫的命名空間。 一般而言,您會在 C# 原始程式檔頂端新增 using 指示詞,這是 Java 套件名稱的 .NET 命名空間版本。 例如,如果系結 .jar 的 Java 套件名稱如下:

com.contoso.package

然後,您會將下列 using 語句放在 C# 來源檔案頂端,以存取系結 .jar 檔案中的類型:

using Com.Contoso.Package;

系結現有的 Android 連結庫時,必須記住下列幾點:

  • 程式庫是否有任何外部相依性? – Android 程式庫所需的任何 Java 相依性必須透過 NuGet 套件或作為 AndroidLibrary 包含在 .NET for Android 專案中。 任何原生元件都必須新增至系結專案做為 AndroidNativeLibrary

  • Android 程式庫的目標 Android API 版本是什麼? – 無法「降級」Android API 層級;請確定適用於 Android 的 .NET 系結專案是以與 Android 連結庫相同的 API 層級(或更高層級)為目標。

將 Java API 調整為 C⧣

適用於 Android 系結產生器的 .NET 將會變更一些 Java 慣用語和模式,以對應至 .NET 模式。 下列清單描述 Java 如何對應至 C#/.NET:

  • Java 中的「Setter/Getter 方法」就是 .NET 中的「Properties」。

  • Java 中的欄位.NET 中的屬性

  • Java 中的接聽程式/接聽程式介面.NET 中的事件 。 回呼介面中方法的參數將由子類別表示 EventArgs

  • Java 中的靜態巢狀類別.NET 中的巢狀類別

  • Java 中的 Inner 類別巢狀類別,具有 C# 中的實例建構函式。

在綁定中包含原生程式庫

在系結 Java 連結庫時,可能需要在 .NET for Android 系結專案中加入 .so 連結庫。 當包裝的 Java 程式代碼執行時,Android 的 .NET 將無法進行 JNI 呼叫,而且錯誤訊息 java.lang.UnsatisfiedLinkError:找不到原生方法: 將會出現在應用程式的 logcat out 中。

修正此問題需要手動使用 Java.Lang.JavaSystem.LoadLibrary 呼叫來載入 .so 函式庫。 例如,假設 .NET for Android 專案已將共用連結庫libpocketsphinx_jni.so 包含在系結專案中,且具有 AndroidNativeLibrary 的建置動作,下列代碼段(在使用共用連結庫之前執行)會載入 .so 連結庫:

Java.Lang.JavaSystem.LoadLibrary("pocketsphinx_jni");

綁定情境

下列系結案例指南可協助您系結 Java 連結庫(或連結庫),以納入您的應用程式:

  • 綁定 Java 程式庫是針對本機可用 .jar.aar 檔案建立綁定庫的操作指南。

  • 從 Maven 系結 Java 連結庫是針對裝載在 Maven 存放庫中的 .jar.aar/ 檔案建立系結連結庫的逐步解說。

  • 自定義系結 說明如何對系結進行手動修改,以解決建置錯誤並塑造產生的 API,使其更類似 C#。

  • 疑難解答綁定 列出常見的綁定錯誤案例、說明可能的原因,並提供解決這些錯誤的建議。