Binda ett Java-bibliotek från Maven

Ett vanligt bindningsscenario är att binda ett Java-bibliotek som finns på en Maven-lagringsplats (till exempel Maven Central).

.NET 9 introducerar stöd för att automatiskt ladda ned ett Java-bibliotek från en Maven-lagringsplats och verifiera dess beroenden för att göra det här scenariot enklare och mer exakt.

Tips/Råd

Om du använder en .NET-version före .NET 9 eller binder ett Java-bibliotek som inte kommer från Maven läser du dokumentationen Om att binda ett Java-bibliotek .

Walkthrough

I den här genomgången ska vi binda versionen 3.1.0 av CircleImageView, ett bibliotek som visar en bild på en cirkulär arbetsyta.

Från Maven-lagringsplatsen kan vi se följande identifierare för det här biblioteket som behövs senare:

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

Skapa bindningsbiblioteket

Skapa först ett nytt bindningsbiblioteksprojekt. Detta kan göras med projektmallen "Android Java Binding Library" som är tillgänglig i Visual Studio eller via kommandoraden dotnet med:

dotnet new android-bindinglib

Öppna projektfilen (.csproj) som skapats av mallen. Vi lägger till ett AndroidMavenLibrary element i ett ItemGroup för att ange det Java-bibliotek som vi vill binda:

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

Skapa nu projektet med hjälp av Kommandot Build i Visual Studio eller från kommandoraden:

dotnet build

Det här Java-biblioteket har nu bundits och det är redo att refereras av ett .NET för Android-programprojekt eller publiceras till NuGet för offentlig förbrukning.

Ytterligare alternativ

Hoppa över hanterade bindningar

Som standardinställning skapas C#-bindningar för alla .JAR/.AAR som placeras i projektet. C#-bindningar kan dock vara svåra att skapa och är inte nödvändiga om du inte tänker anropa Java-API:et från C#.

Detta gäller särskilt när Java-biblioteket helt enkelt är beroende av ett annat Java-bibliotek och inte behöver anropas direkt från C#. I det här fallet Bind="false" kan attributet endast användas för att inkludera Java-beroendet men inte binda det.

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

Nästa steg

  • AndroidMavenLibrary Alternativ – Genomgångsbiblioteket hämtades automatiskt från Maven Central som är standardlagringsplatsen. Andra Maven-lagringsplatser och alternativ kan anges.

  • Java-beroendeverifiering – Java-biblioteket som är bundet i genomgången är trivialt och var inte beroende av några andra Java-paket. De flesta bibliotek är beroende av andra Java-paket och fel visas för att säkerställa att dessa beroenden kan lösas.

Dessa fel måste åtgärdas innan bindningen kan skapas och se ut så här:

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.
  • Anpassning av bindningar med metadata – Java-biblioteket som är bundet i genomgången är trivialt och bindningsverktyget kunde konvertera det helt automatiskt till ett C#-API. Tyvärr är detta ofta inte fallet och det kommer ofta att finnas kompileringsfel. Dessa fel måste åtgärdas med "metadata" för att manuellt instruera bindningsverktyget hur du löser skillnader mellan Java- och C#-språken.

  • Ändra namnområden – Typerna i genomgången hamnar i .NET-namnområdet DE.Hdodenhof.Circleimageview. Java-paketnamn tenderar att vara mer utförliga än .NET-namnområden och det kan vara mer önskvärt att ändra det, till exempel att CircleImageViewLibrary använda en AndroidNamespaceReplacement:

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