通过


绑定 Java 库

Android 的第三方库生态系统非常庞大。 正因为此,使用现有的 Android 库通常比创建一个新的库更合理。

.NET for Android 允许使用绑定库执行此操作,该绑定库使用 C# 包装器自动包装库,以便可以通过 C# 调用 Java 代码。

这是通过使用 托管可调用包装器MCW)实现的。 MCW 是一个 JNI 桥,在托管代码需要调用 Java 代码时会使用它。 托管可调用包装器还支持对 Java 类型进行子类化以及覆盖 Java 类型的虚拟方法。 同样,每当 Android 运行时 (ART) 代码需要调用托管代码时,它都会通过另一个称为 Android 可调用包装器 (ACW) 的 JNI 桥来实现。 下图说明了此体系结构:

Android JNI 桥体系结构

绑定库是一个程序集,其中包含用于 Java 类型的托管可调用包装器。 例如,以下是我们希望在 Bindings Library 中封装的 Java 类型 MyClass

package com.contoso.mycode;

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

为包含 的 .jarMyClass 生成绑定库之后,可以对其进行实例化并通过 C# 对其调用方法:

var instance = new MyClass ();

string result = instance.MyMethod (42);

若要创建此绑定库,请使用适用于 .NET for Android 的 Android Java 绑定库 模板。 生成的绑定项目创建了一个包含 MCW 类的 .NET 程序集,其中嵌入了 .jar 和 .aar 文件以及 Android 库项目的资源。 通过引用生成的绑定库程序集,可以在 .NET for Android 项目中重复使用现有的 Java 库。

在绑定库中引用类型时,必须使用绑定库的命名空间。 通常,会在作为 Java 包名称的 .NET 命名空间版本的 C# 源文件的顶部添加一个 using 指令。 例如,如果绑定的.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 级别;确保 .NET for Android 绑定项目面向与 Android 库相同的 API 级别(或更高)。

将 Java API 适配到 C⧣

适用于 Android 绑定生成器的 .NET 将更改一些 Java 习惯和模式,以对应于 .NET 模式。 以下列表介绍如何将 Java 映射到 C#/.NET:

  • Java 中的Setter/Getter 方法在 .NET 中被称为属性

  • Java 中的字段在 .NET 中称为属性

  • Java 中的“侦听器/侦听器接口”是 .NET 中的“事件”。 回调接口中的方法的参数将由 EventArgs 子类表示。

  • Java 中的“静态嵌套类”是 .NET 中的“嵌套类”

  • Java 中的“内部类”是 C# 中包含实例构造函数的“嵌套类”

在绑定中包含原生库

可能需要在 .NET for Android 绑定项目中包括 .so 库作为绑定 Java 库的一部分。 执行包装的 Java 代码时,适用于 Android 的 .NET 将无法进行 JNI 调用,并且错误消息 java.lang.UnsatisfiedLinkError:找不到本机方法: 将在应用程序的 logcat 中显示。

解决此问题的方法是通过调用Java.Lang.JavaSystem.LoadLibrary手动加载.so库。 例如,假设适用于 Android 项目的 .NET 具有具有 AndroidNativeLibrary 生成操作的绑定项目中的共享库libpocketsphinx_jni.so,则以下代码片段(在使用共享库之前执行)将加载 .so 库:

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

绑定方案

以下绑定方案指南可帮助你绑定一个或多个 Java 库以将其合并到应用中: