Binden einer JAR-Datei

Wichtig

Wir untersuchen derzeit die Nutzung benutzerdefinierter Bindungen auf der Xamarin-Plattform. Nehmen Sie an dieser Umfrage teil, um zukünftige Entwicklungsarbeiten zu unterstützen.

Diese exemplarische Vorgehensweise enthält ausführliche Anleitungen zum Erstellen einer Xamarin.Android-Java-Bindungsbibliothek aus einem Android-JAR-Datei.

Übersicht

Die Android-Community hat viele Java-Bibliotheken veröffentlicht, die Sie für Ihre App verwenden können. Diese Java-Bibliotheken werden häufig im JAR-Format (Java Archive) gepackt. Sie können eine JAR-Datei jedoch in eine Bibliothek für Java-Bindungen packen, sodass deren Funktionen von Xamarin.Android-Apps genutzt werden können. Der Zweck der Bibliothek für Java-Bindungen besteht darin, die in der JAR-Datei enthaltenen APIs über automatisch generierte Codewrapper dem C#-Code zur Verfügung zu stellen.

Xamarin-Tools können eine Bindungsbibliothek aus mindestens einer JAR-Eingabedatei generieren. Die Bindungsbibliothek (DLL-Assembly) enthält Folgendes:

  • den Inhalt der ursprünglichen JAR-Datei(en)

  • Managed Callable Wrappers (MCW), bei denen es sich um C#-Typen handelt, die die entsprechenden Java-Typen innerhalb von umschließen. JAR-Dateien.

Der generierte MCW-Code verwendet JNI (Java Native Interface), um Ihre API-Aufrufe an die zugrunde liegende JAR-Datei weiterzuleiten. Sie können Bindungsbibliotheken für eine beliebige JAR-Datei erstellen, die ursprünglich für die Verwendung mit Android konzipiert war. Beachten Sie jedoch, dass Xamarin-Tools die Bindung von Nicht-Android-Java-Bibliotheken derzeit nicht unterstützen. Sie können auch festlegen, dass die Bindungsbibliothek erstellt werden soll, ohne den Inhalt der JAR-Datei einzubeziehen, sodass die DLL zur Laufzeit eine Abhängigkeit zur JAR-Datei aufweist.

In dieser Anleitung werden die Grundlagen der Erstellung einer Bindungsbibliothek für eine einzelne JAR-Datei ausführlich erläutert. Wir veranschaulichen anhand eines Beispiels, wo alles richtig läuft– d. h. wo keine Anpassung oder kein Debuggen von Bindungen erforderlich ist. Das Erstellen von Bindungen mithilfe von Metadaten ist ein Beispiel für ein erweitertes Szenario, bei dem der Bindungsprozess nicht vollständig automatisch erfolgt und ein gewisser manueller Eingriff erforderlich ist. Eine allgemeine Übersicht über die Java-Bibliotheksbindung (mit einem einfachen Codebeispiel) finden Sie unter Binden einer Java-Bibliothek.

Exemplarische Vorgehensweise

In der folgenden exemplarischen Vorgehensweise erstellen Sie eine Bindungsbibliothek für Picasso, eine beliebte Android-JAR-Datei, die Funktionen zum Laden und Zwischenspeichern von Bildern bereitstellt. Führen Sie die folgenden Schritte aus, um picasso-2.x.x.jar zu binden und somit eine neue .NET-Assembly zu erstellen, die Sie in einem Xamarin.Android-Projekt verwenden können:

  1. Erstellen Sie ein neues Java-Bindungsbibliotheksprojekt.

  2. Fügen Sie die JAR-Datei zum Projekt hinzu.

  3. Legen Sie die entsprechende Buildaktion für die JAR-Datei fest.

  4. Wählen Sie das Zielframework aus, das die JAR-Datei unterstützt.

  5. Erstellen Sie die Bindungsbibliothek.

Nachdem Sie die Bindungsbibliothek erstellt haben, entwickeln Sie eine einfache Android-App, die das Abrufen von APIs in der Bindungsbibliothek veranschaulicht. In diesem Beispiel möchten Sie auf Methoden von picasso-2.x.x.jar zugreifen:

package com.squareup.picasso

public class Picasso
{
    ...
    public static Picasso with (Context context) { ... };
    ...
    public RequestCreator load (String path) { ... };
    ...
}

Nachdem Sie eine Bindungsbibliothek für picasso-2.x.x.jar generiert haben, können Sie diese Methoden von C# abrufen. Zum Beispiel:

using Com.Squareup.Picasso;
...
Picasso.With (this)
    .Load ("https://mydomain.myimage.jpg")
    .Into (imageView);

Erstellen der Bindungbibliothek

Bevor Sie mit den folgenden Schritten beginnen, müssen Sie picasso-2.x.x.jar herunterladen.

Erstellen Sie zunächst ein neues Bindungsbibliotheksprojekt. Erstellen Sie in Visual Studio für Mac oder Visual Studio eine neue Projektmappe, und wählen Sie die Vorlage Android-Bindungsbibliothek aus. (Die Screenshots in dieser exemplarischen Vorgehensweise stammen aus Visual Studio, aber Visual Studio für Mac ist sehr ähnlich.) Nennen Sie die Projektmappe JarBinding:

Erstellen eines JarBinding-Bibliotheksprojekts

Die Vorlage enthält den Ordner Jars, in dem Sie Ihre JAR-Datei(en) zum Bindungsbibliotheksprojekt hinzufügen können. Klicken Sie mit der rechten Maustaste auf den Ordner JARs, und wählen Sie Vorhandenes Element hinzufügen >aus:

Vorhandenes Element hinzufügen

Navigieren Sie zur zuvor heruntergeladenen Datei picasso-2.x.x.jar, wählen Sie sie aus, und klicken Sie auf Hinzufügen:

Wählen Sie die JAR-Datei aus, und klicken Sie auf Hinzufügen.

Vergewissern Sie sich, dass die Datei picasso-2.x.x.jar dem Projekt erfolgreich hinzugefügt wurde:

Jar-Datei zum Projekt hinzugefügt

Wenn Sie ein Java-Bindungsbibliotheksprojekt erstellen, müssen Sie angeben, ob die JAR-Datei in die Bindungsbibliothek eingebettet oder separat gepackt ist. Zu diesem Zweck geben Sie eine der folgenden Buildaktionen an:

  • EmbeddedJar : . JAR wird in die Bindungsbibliothek eingebettet.

  • InputJar : . JAR wird von der Bindungsbibliothek getrennt gehalten.

In der Regel verwenden Sie die Buildaktion EmbeddedJar, damit die JAR-Datei automatisch in die Bindungsbibliothek gepackt wird. Dies ist die einfachste Option : Java-Bytecode in . JAR wird in Dex-Bytecode konvertiert und (zusammen mit den Managed Callable Wrappers) in Ihr APK eingebettet. Wenn die JAR-Datei getrennt von der Bindungsbibliothek gespeichert werden soll, können Sie die Option InputJar verwenden. Sie müssen jedoch sicherstellen, dass die JAR-Datei auf dem Gerät verfügbar ist, auf dem die App ausgeführt wird.

Legen Sie die Buildaktion auf EmbeddedJar fest:

Auswählen der Buildaktion

Öffnen Sie als Nächstes die Projekteigenschaften, um das Zielframework zu konfigurieren. Wenn die JAR-Datei Android-APIs verwendet, sollten Sie das Zielframework auf die API-Ebene festlegen, die die JAR-Datei erwartet. In der Regel gibt der Entwickler der JAR-Datei an, mit welchen API-Ebenen die JAR-Datei kompatibel ist. Weitere Informationen zur Einstellung des Zielframeworks und den Android-API-Ebenen im Allgemeinen finden Sie unter Grundlegendes zu Android-API-Ebenen.

Legen Sie die API-Zielebene für Ihre Bindungsbibliothek fest (in diesem Beispiel wird API-Ebene 19 verwendet):

Auf API 19 festgelegte Ziel-API-Ebene

Erstellen Sie abschließend die Bindungsbibliothek. Obwohl möglicherweise einige Warnmeldungen angezeigt werden, sollte das Projekt für die Bindungsbibliothek erfolgreich erstellt und eine Ausgabe-DLL an folgendem Speicherort erzeugt werden: JarBinding/bin/Debug/JarBinding.dll

Verwenden der Bindungsbibliothek

Sie können die DLL folgendermaßen in Ihrer Xamarin.Android-App nutzen:

  1. Fügen Sie einen Verweis auf die Bindungsbibliothek hinzu.

  2. Führen Sie über die verwalteten Aufrufwrapper Aufrufe der JAR-Datei durch.

In den folgenden Schritten erstellen Sie eine einfache App, die die Bindungsbibliothek zum Herunterladen und Anzeigen eines Bilds in einem ImageView-Element verwendet. Die meiste Arbeit verrichtet dabei der Code in der JAR-Datei.

Erstellen Sie zunächst eine neue Xamarin.Android-App, die die Bindungsbibliothek nutzt. Klicken Sie mit der rechten Maustaste auf die Projektmappe, wählen Sie Neues Projekt hinzufügen aus, und benennen Sie das neue Projekt BindingTest. Diese App wird in derselben Projektmappe wie die Bindungsbibliothek erstellt, um diese exemplarische Vorgehensweise zu vereinfachen. Allerdings kann sich die App, die die Bindungsbibliothek verwendet, auch in einer anderen Projektmappe befinden:

Hinzufügen eines neuen BindingTest-Projekts

Klicken Sie mit der rechten Maustaste auf den Knoten Verweise des BindingTest-Projekts, und wählen Sie Verweis hinzufügen... aus:

Rechtsverweis hinzufügen

Wählen Sie das zuvor erstellte Projekt JarBinding aus, und klicken Sie auf OK:

Auswählen des JarBinding-Projekts

Öffnen Sie den Knoten Verweise des BindingTest-Projekts, und vergewissern Sie sich, dass der Verweis auf JarBinding vorhanden ist:

JarBinding wird unter Verweise angezeigt.

Ändern Sie das Layout von BindingTest (Main.axml), sodass nur ein ImageView-Element vorhanden ist:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:minWidth="25px"
    android:minHeight="25px">
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/imageView" />
</LinearLayout>

Fügen Sie mainActivity.cs die folgende using Anweisung hinzu. Dadurch können Sie problemlos auf die Methoden der Java-basierten Picasso Klasse zugreifen, die sich in der Bindungsbibliothek befindet:

using Com.Squareup.Picasso;

Ändern Sie die OnCreate-Methode so, dass sie die Picasso-Klasse verwendet, um ein Bild aus einer URL zu laden und in ImageView anzuzeigen:

public class MainActivity : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.Main);
        ImageView imageView = FindViewById<ImageView>(Resource.Id.imageView);

        // Use the Picasso jar library to load and display this image:
        Picasso.With (this)
            .Load ("https://i.imgur.com/DvpvklR.jpg")
            .Into (imageView);
    }
}

Kompilieren Sie das Projekt BindingTest, und führen Sie es aus. Die App wird gestartet, und nach einer kurzen Verzögerung (abhängig von den Netzwerkbedingungen) sollte ähnlich wie auf dem folgenden Screenshot ein Bild heruntergeladen und angezeigt werden:

Screenshot der Ausführung von BindingTest

Herzlichen Glückwunsch! Sie haben erfolgreich eine JAR-Datei für eine Java-Bibliothek gebunden und in Ihrer Xamarin.Android-App eingesetzt.

Zusammenfassung

In dieser exemplarischen Vorgehensweise haben Sie eine Bindungsbibliothek für eine JAR-Datei eines Drittanbieters erstellt, die Bindungsbibliothek zu einer einfachen Test-App hinzugefügt und die App ausgeführt, um sich davon zu überzeugen, dass der C#-Code den Java-Code in der JAR-Datei aufrufen kann.