Привязка библиотеки Java из Maven

Распространенный сценарий привязки — привязка библиотеки Java, размещенной в репозитории Maven (например , Maven Central).

.NET 9 предоставляет поддержку автоматического скачивания библиотеки Java из репозитория Maven и проверки зависимостей для упрощения и более точного сценария.

Совет

Если используется версия .NET до .NET 9 или привязка Java-библиотеки, не из Maven, см. документацию по привязке Java-библиотеки.

Пошаговое руководство

В этом пошаговом руководстве мы собираемся привязать версию 3.1.0 CircleImageView, библиотеку, отображающую изображение на круговом холсте.

В репозитории Maven можно увидеть следующие идентификаторы для этой библиотеки, которые потребуются позже:

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

Создание библиотеки привязок

Для начала создайте проект библиотеки привязок. Это можно сделать с помощью шаблона проекта "Библиотека привязки Java для Android", доступного в Visual Studio или с помощью командной dotnet строки:

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 для Android или опубликована в NuGet для общедоступного потребления.

Дополнительные параметры

Пропуск управляемых привязок

По умолчанию привязки C# будут созданы для любого .JAR/.AAR, помещенного в проект. Однако привязки C# могут быть сложными для создания и не требуются, если вы не планируете вызывать API Java из C#.

Это особенно касается того, что библиотека 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, используемая в пошаговом руководстве, является тривиальной, и средство привязки смогло полностью преобразовать её в API C#. К сожалению, это часто не так, и часто возникают ошибки компиляции. Эти ошибки должны быть исправлены с помощью метаданных вручную, чтобы указать инструмент привязки, как устранить различия между языками Java и C#.

  • Изменение пространств имен — типы в пошаговом руководстве в конечном итоге в пространстве DE.Hdodenhof.Circleimageviewимен .NET. Имена пакетов Java, как правило, более многословные, чем пространства имен .NET, и возможно было бы более целесообразно их изменить, например CircleImageViewLibrary с помощью AndroidNamespaceReplacement:

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