Delen via


Een Java-bibliotheek binden vanuit Maven

Een veelvoorkomend bindingsscenario is het binden van een Java-bibliotheek die wordt gehost in een Maven-opslagplaats (zoals Maven Central).

.NET 9 introduceert ondersteuning voor het automatisch downloaden van een Java-bibliotheek vanuit een Maven-opslagplaats en het verifiëren van de afhankelijkheden om dit scenario gemakkelijker en nauwkeuriger te maken.

Aanbeveling

Als u een .NET-versie gebruikt vóór .NET 9 of een Java-bibliotheek bindt die niet afkomstig is van Maven, raadpleegt u de documentatie voor binding van een Java-bibliotheek .

Stapsgewijze handleiding

In dit scenario gaan we de versie 3.1.0 van CircleImageView binden, een bibliotheek die een afbeelding op een cirkelvormig canvas weergeeft.

In de Maven-opslagplaats zien we de volgende id's voor deze bibliotheek die later nodig zijn:

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

De bindingsbibliotheek maken

Maak eerst een nieuw Bindings Library-project. Dit kan worden gedaan met de projectsjabloon 'Android Java Binding Library' die beschikbaar is in Visual Studio of via de dotnet opdrachtregel met:

dotnet new android-bindinglib

Open het projectbestand (.csproj) dat door de sjabloon is gemaakt. We voegen een AndroidMavenLibrary element toe in een ItemGroup om de Java-bibliotheek op te geven die we willen binden:

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

Bouw nu het project met behulp van de opdracht Build van Visual Studio of vanaf de opdrachtregel:

dotnet build

Deze Java-bibliotheek is nu gebonden en kan worden verwezen door een .NET voor Android-toepassingsproject of gepubliceerd naar NuGet voor openbaar gebruik.

Aanvullende opties

Beheerde bindingen overslaan

Standaard worden C#-bindingen gemaakt voor elke . JAR/. AAR in het project geplaatst. C#-bindingen kunnen echter lastig zijn om te maken en zijn niet nodig als u niet van plan bent om de Java-API aan te roepen vanuit C#.

Dit is met name het geval wanneer de Java-bibliotheek gewoon een afhankelijkheid is van een andere Java-bibliotheek en niet rechtstreeks vanuit C# hoeft te worden aangeroepen. In dit geval kan het Bind="false" kenmerk worden gebruikt om alleen de Java-afhankelijkheid op te nemen, maar niet te binden.

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

Volgende stappen 

  • AndroidMavenLibrary Opties : de walkthrough-bibliotheek is automatisch gedownload van Maven Central. Dit is de standaardopslagplaats. Andere Maven-opslagplaatsen en -opties kunnen worden opgegeven.

  • Verificatie van Java-afhankelijkheden - De Java-bibliotheek die in de walkthrough is gebonden, is eenvoudig en heeft geen afhankelijkheden van andere Java-pakketten. De meeste bibliotheken zijn afhankelijk van andere Java-pakketten en er worden fouten weergegeven om ervoor te zorgen dat deze afhankelijkheden kunnen worden opgelost.

Deze fouten moeten worden opgelost voordat de binding kan worden gebouwd en er als volgt uitziet:

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.
  • Bindingen aanpassen met metagegevens : de Java-bibliotheek die in het overzicht is gebonden, is triviaal en de bindingshulpprogramma's konden deze volledig automatisch converteren naar een C#-API. Helaas is dit vaak niet het geval en zijn er vaak compilatiefouten. Deze fouten moeten worden opgelost met 'metagegevens' om handmatig de bindingshulpprogramma's te instrueren om verschillen tussen de Java- en C#-talen op te lossen.

  • Naamruimten wijzigen : de typen in het overzicht eindigen op de .NET-naamruimte DE.Hdodenhof.Circleimageview. Java-pakketnamen zijn meestal uitgebreider dan .NET-naamruimtes, en het kan wenselijk zijn om ze aan te passen, bijvoorbeeld CircleImageViewLibrary met een AndroidNamespaceReplacement:

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