Java-kódtár kötése a Mavenből

Gyakori kötési forgatókönyv egy Maven-adattárban (például Maven Central) üzemeltetett Java-kódtár kötése.

A .NET 9 támogatja a Java-kódtárak automatikus letöltését egy Maven-adattárból, és ellenőrzi a függőségeit, hogy megkönnyítse és pontosabbá tegye ezt a forgatókönyvet.

Jótanács

Ha .NET-verziót használ a .NET 9 előtt, vagy nem a Mavenből származó Java-kódtárat köt, tekintse meg a Java-kódtár kötésének dokumentációját.

Walkthrough

Ebben az útmutatóban a CircleImageView könyvtár 3.1.0 verzióját kötjük össze, amelyen a kép kör alakú vásznon jelenik meg.

A Maven-adattárban a következő azonosítókat láthatjuk ehhez a kódtárhoz, amelyekre később szükség lesz:

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

A kapcsolódási könyvtár létrehozása

Először hozzon létre egy új kötéstár projektet. Ez a Visual Studióban elérhető "Android Java Binding Library" projektsablonnal vagy a dotnet következő parancssoron keresztül végezhető el:

dotnet new android-bindinglib

Nyissa meg a sablon által létrehozott projektfájlt (.csproj). Egy AndroidMavenLibrary elemet adunk hozzá egy ItemGroup belsejébe, hogy megadjuk a kötéshez használni kívánt Java-könyvtárat.

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

Most hozza létre a projektet a Visual Studio Build parancsával vagy a parancssorból:

dotnet build

Ez a Java-kódtár már kötött, és készen áll arra, hogy egy .NET for Android-alkalmazásprojekt hivatkozzon rá, vagy nyilvános felhasználás céljából közzétehesse a NuGetben.

További lehetőségek

Felügyelt bináris kapcsolatok kerülése

Alapértelmezés szerint a C#-kötések létrejönnek minden .JAR/.AAR fájlhoz, amelyet a projektbe helyeznek. A C#-kötések létrehozása azonban bonyolult lehet, és nem szükséges, ha nem kívánja meghívni a Java API-t a C#-ból.

Ez különösen akkor fordul elő, ha a Java-kódtár egyszerűen egy másik Java-kódtár függősége, és nem kell közvetlenül a C#-ból meghívni. Ebben az esetben az Bind="false" attribútum csak a Java-függőség belefoglalására használható, de nem kötésre.

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

Következő lépések

  • AndroidMavenLibrary Beállítások – Az útmutatótár automatikusan le lett töltve a Maven Centralról, amely az alapértelmezett adattár. Más Maven-adattárak és lehetőségek is megadhatóak.

  • Java-függőség ellenőrzése – Az útmutatóban szereplő Java-kódtár triviális, és nem függ más Java-csomagoktól. A legtöbb kódtár más Java-csomagoktól függ, és a rendszer hibákat jelenít meg, hogy ezek a függőségek feloldhatók legyenek.

Ezeket a hibákat a kötés létrehozása előtt ki kell javítani, és a következőképpen kell kinéznie:

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.
  • Kötések testreszabása metaadatokkal – Az útmutatóban megkötött Java-kódtár triviális, és a kötési eszköz teljesen automatikusan C# API-vá tudta konvertálni. Sajnos ez gyakran nem így van, és gyakran lesznek fordítási hibák. Ezeket a hibákat "metaadatokkal" kell kijavítani, hogy manuálisan utasítsa a kötési eszközt a Java és a C#-nyelvek közötti különbségek megoldására.

  • Névterek módosítása – Az útmutatóban szereplő típusok a .NET névtérben végződnek DE.Hdodenhof.Circleimageview. A Java-csomagnevek általában részletesebbek, mint a .NET-névterek, és célszerűbb lehet módosítani, például:CircleImageViewLibraryAndroidNamespaceReplacement

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