Partilhar via


Ligar uma biblioteca Java a partir do Maven

Um cenário comum de binding é associar uma biblioteca Java alojada num repositório Maven (como o Maven Central).

O .NET 9 introduz suporte para descarregar automaticamente uma biblioteca Java a partir de um repositório Maven e verificar as suas dependências para ajudar a tornar este cenário mais fácil e preciso.

Sugestão

Se estiver a usar uma versão .NET antes do .NET 9 ou a vincular uma biblioteca Java que não seja do Maven, consulte a documentação Binding a Java Library .

Walkthrough

Neste walkthrough, vamos associar a versão 3.1.0 do CircleImageView, uma biblioteca que apresenta uma imagem numa tela circular.

Do repositório Maven, vemos os seguintes identificadores para esta biblioteca que serão necessários mais tarde:

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

Criação da biblioteca de vínculo

Primeiro, crie um novo projeto Bindings Library. Isto pode ser feito com o modelo de projeto "Android Java Binding Library" disponível no Visual Studio ou através da dotnet linha de comandos com:

dotnet new android-bindinglib

Abra o ficheiro do projeto (.csproj) criado pelo modelo. Vamos adicionar um AndroidMavenLibrary elemento dentro de e ItemGroup para especificar a biblioteca Java que queremos vincular:

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

Agora constrói o projeto usando o comando Build do Visual Studio, ou a partir da linha de comandos:

dotnet build

Esta biblioteca Java já foi encadernada e pronta para ser referenciada por um projeto de aplicação .NET para Android ou publicada no NuGet para consumo público.

Opções adicionais

Saltar fixações geridas

Por defeito, serão criados bindings de C# para qualquer ficheiro .JAR/.AAR colocado no projeto. No entanto, os bindings em C# podem ser complicados de criar e não são necessários se não pretender chamar a API Java a partir do C#.

Isto é especialmente verdade quando a biblioteca Java é simplesmente uma dependência de outra biblioteca Java e não precisa de ser chamada diretamente de C#. Neste caso, o Bind="false" atributo pode ser usado apenas para incluir a dependência do Java, mas sem a vincular.

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

Passos seguintes

  • AndroidMavenLibrary Opções - A biblioteca de walkthrough foi automaticamente descarregada do Maven Central, que é o repositório predefinido. Outros repositórios e opções dos Maven podem ser especificados.

  • Verificação de Dependência Java - A biblioteca Java integrada na demonstração é trivial e não dependia de outros pacotes Java. A maioria das bibliotecas dependerá de outros pacotes Java e serão apresentados erros para garantir que estas dependências possam ser resolvidas.

Estes erros devem ser corrigidos antes de a ligação poder ser construída, e apresentam-se como:

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.
  • Personalização de Bindings com Metadados - A biblioteca Java vinculada no passo a passo é trivial e as ferramentas de binding conseguiram convertê-la totalmente de forma automática para uma API C#. Infelizmente, isso muitas vezes não acontece e haverá frequentemente erros de compilação. Estes erros devem ser corrigidos com "metadados" para instruir manualmente a ferramenta de binding como resolver diferenças entre as linguagens Java e C#.

  • Alteração de Namespaces - Os tipos no tutorial acabam por ficar no namespace DE.Hdodenhof.Circleimageview.NET. Os nomes dos pacotes Java tendem a ser mais verbosos do que os namespaces .NET e pode ser mais desejável alterá-los, por exemplo, para CircleImageViewLibrary usar um AndroidNamespaceReplacement:

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