通过


从 Maven 绑定 Java 库

常见的绑定方案是绑定 Maven 存储库(如 Maven Central)中托管的 Java 库。

.NET 9 引入了对从 Maven 存储库自动下载 Java 库的支持,并验证其依赖项,以帮助使此方案更轻松、更准确。

提示

如果在 .NET 9 之前使用 .NET 版本或绑定不是 Maven 的 Java 库,请参阅 “绑定 Java 库 ”文档。

操作指南

在本演练中,我们将绑定 CircleImageView 的版本 3.1.0 ,该库在圆形画布中显示图像。

在 Maven 存储库中,我们可以看到此库的以下标识符,稍后将需要这些标识符:

<dependency>
    <groupId>de.hdodenhof</groupId>
    <artifactId>circleimageview</artifactId>
    <version>3.1.0</version>
</dependency>

创建绑定库

首先,新建一个 Bindings Library 项目。 这可以通过 Visual Studio dotnet 中提供的“Android Java 绑定库”项目模板或通过命令行完成:

dotnet new android-bindinglib

打开模板创建的项目文件(.csproj)。 我们将在一AndroidMavenLibrary个元素中添加一个ItemGroup元素来指定要绑定的 Java 库:

<!-- Include format is {GroupId}:{ArtifactId} -->
<ItemGroup>
  <AndroidMavenLibrary Include="de.hdodenhof:circleimageview" Version="3.1.0" />
</ItemGroup>

现在,使用 Visual Studio 的“生成”命令或从命令行生成项目:

dotnet build

此 Java 库现已绑定,可供 .NET for Android 应用程序项目引用或发布到 NuGet 以供公共使用。

其他选项

跳过托管绑定

默认情况下,任何放置在项目中的 .JAR/.AAR 文件都会生成 C# 绑定。 但是,创建 C# 绑定可能很棘手,如果您不打算从 C# 调用 Java API,则没有必要这样做。

尤其是当 Java 库只是另一个 Java 库的依赖项,不需要直接从 C# 调用时,这种情况尤其如此。 在这种情况下, Bind="false" 该属性只能包含 Java 依赖项,但不能绑定它。

<ItemGroup>
  <AndroidMavenLibrary Include="de.hdodenhof:circleimageview" Version="3.1.0" Bind="false" />
</ItemGroup>

后续步骤

  • AndroidMavenLibrary 选项 - 演练库是从默认存储库的 Maven Central 自动下载的。 可以指定其他 Maven 存储库和选项。

  • Java 依赖项验证 - 演练中绑定的 Java 库非常简单,并不依赖于任何其他 Java 包。 大多数库将依赖于其他 Java 包,并会显示错误,以确保可以解决这些依赖项。

必须先修复这些错误,然后绑定才能生成,如下所示:

error XA4241: Java dependency 'androidx.collection:collection:1.0.0' is not satisfied.
error XA4242: Java dependency 'org.jetbrains.kotlin:kotlin-stdlib:1.9.0' is not satisfied. Microsoft maintains the NuGet package 'Xamarin.Kotlin.StdLib' that could fulfill this dependency.
  • 使用元数据自定义绑定 - 演练中绑定的 Java 库非常简单,绑定工具能够自动将其完整转换为 C# API。 遗憾的是,情况往往不是这样,通常会出现编译错误。 必须使用“元数据”来修复这些错误,以手动指示绑定工具如何解决 Java 和 C# 语言之间的差异。

  • 更改命名空间 - 演练中的类型最终出现在 .NET 命名空间 DE.Hdodenhof.Circleimageview中。 Java 包名称往往比 .NET 命名空间更冗长,通常更适合更改,例如 CircleImageViewLibrary 使用 AndroidNamespaceReplacement

<ItemGroup>
  <AndroidNamespaceReplacement Include='DE.Hdodenhof.Circleimageview' Replacement='CircleImageViewLibrary' />
</ItemGroup>