常见的绑定方案是绑定 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>