Freigeben über


Binden von Java-Bibliotheken

Das Ökosystem für Bibliotheken von Drittanbietern für Android ist enorm. Aus diesem Grund ist es oft sinnvoller, eine vorhandene Android-Bibliothek zu verwenden, als eine neue zu erstellen.

.NET für Android ermöglicht Ihnen dies mit einer Bindings Library , die die Bibliothek automatisch mit C#-Wrappern umschließt, damit Sie Java-Code über C#-Aufrufe aufrufen können.

Dies wird mithilfe von Managed Callable Wrappers (MCW) implementiert. MCW ist eine JNI-Brücke, die verwendet wird, wenn verwalteter Code Java-Code aufrufen muss. Verwaltete Aufrufwrapper bieten auch Unterstützung für das Erstellen von Unterklassen für Java-Typen und das Überschreiben virtueller Methoden von Java-Typen. Wenn der Android Runtime (ART)-Code verwalteten Code aufrufen möchte, geschieht dies ebenfalls über eine andere JNI-Brücke, die als Android Callable Wrapper (ACW) bezeichnet wird. Diese Architektur wird in der nachfolgenden Abbildung dargestellt:

Architektur der Android-JNI-Brücke

Eine Bindings-Bibliothek ist eine Assembly, die verwaltete aufzurufende Wrapper für Java-Typen enthält. Hier sehen Sie beispielsweise einen Java-Typ (MyClass), den Sie in eine Bindungsbibliothek einschließen möchten:

package com.contoso.mycode;

public class MyClass
{
    public String myMethod (int i) { ... }
}

Nachdem wir eine Bindungsbibliothek für die JAR-Datei generiert haben, die MyClass enthält, können wir diese instanziieren und Methoden von C# für sie aufrufen:

var instance = new MyClass ();

string result = instance.MyMethod (42);

Zum Erstellen dieser Bindungsbibliothek verwenden Sie die .NET für Android Android Java Binding Library-Vorlage. Das resultierende Bindungsprojekt erstellt eine .NET-Assembly mit den MCW-Klassen, .jar/.aar-Dateien und den darin eingebetteten Ressourcen für Android-Bibliotheksprojekte. Durch Verweisen auf die resultierende Bindings Library-Assembly können Sie eine vorhandene Java-Bibliothek in Ihrem .NET für Android-Projekt wiederverwenden.

Wenn Sie auf Typen in der Bindungsbibliothek verweisen, müssen Sie den Namespace der Bindungsbibliothek verwenden. In der Regel fügen Sie am Anfang Ihrer C#-Quelldateien eine using-Direktive hinzu, die die .NET-Namespaceversion des Java-Paketnamens ist. Beispiel: Der Java-Paketname für die gebundene JAR-Datei ist der folgende:

com.contoso.package

Dann fügen Sie die folgende using-Anweisung am Anfang der C#-Quelldateien ein, um auf Typen in der gebundenen JAR-Datei zuzugreifen:

using Com.Contoso.Package;

Beim Binden einer vorhandenen Android-Bibliothek müssen folgende Punkte beachtet werden:

  • Gibt es externe Abhängigkeiten für die Bibliothek? – Alle Java-Abhängigkeiten, die von der Android-Bibliothek benötigt werden, müssen über ein NuGet-Paket oder als AndroidLibrary im .NET für Android-Projekt enthalten sein. Alle systemeigenen Assemblys müssen dem Bindungsprojekt als AndroidNativeLibrary hinzugefügt werden.

  • Welche Version der Android-API ist das Ziel der Android-Bibliothek? – Es ist nicht möglich, die Android-API-Ebene "herabstufen"; Stellen Sie sicher, dass das .NET für Android-Bindungsprojekt auf die gleiche API-Ebene (oder höher) wie die Android-Bibliothek ausgerichtet ist.

Anpassen von Java-APIs an C⧣

Der .NET für Android-Bindungsgenerator ändert einige Java-Idiome und -Muster entsprechend .NET-Mustern. In der folgenden Liste wird beschrieben, wie Java C#/.NET zugeordnet wird:

  • Setter- und Getter-Methoden in Java sind Eigenschaften in .NET.

  • Felder in Java sind Eigenschaften in .NET.

  • Listener/Listenerschnittstellen in Java entsprechen Ereignissen in .NET. Die Parameter der Methoden in den Rückrufschnittstellen werden durch eine EventArgs-Unterklasse dargestellt.

  • Eine statische, geschachtelte Klasse in Java ist eine geschachtelte Klasse in .NET.

  • Eine Java-Innere Klasse ist eine C#-Verschachtelte Klasse mit einem Instanzkonstruktor.

Einschließen einer systemeigenen Bibliothek in eine Anbindung

Es kann erforderlich sein, eine .so-Bibliothek in ein .NET für Android-Bindungsprojekt als Teil der Bindung einer Java-Bibliothek einzuschließen. Wenn der eingeschlossene Java-Code ausgeführt wird, wird .NET für Android mit dem JNI-Aufruf scheitern und die Fehlermeldung java.lang.UnsatisfiedLinkError: Native method not found: wird in der Logcat-Ausgabe der Anwendung erscheinen.

Dieses Problem kann behoben werden, indem die .so-Bibliothek manuell über einen Aufruf von Java.Lang.JavaSystem.LoadLibrary geladen wird. Angenommen, ein .NET für Android-Projekt hat die freigegebene Bibliothek libpocketsphinx_jni.so im Bindungsprojekt mit einer Build-Aktion von AndroidNativeLibrary, wird der folgende Codeausschnitt (ausgeführt vor der Nutzung der freigegebenen Bibliothek) die .so-Bibliothek laden:

Java.Lang.JavaSystem.LoadLibrary("pocketsphinx_jni");

Bindungsszenarien

Die folgenden Leitfäden für Bindungsszenarios können Ihnen helfen, eine oder mehrere Java-Bibliotheken für die Einbindung in Ihre App zu binden:

  • Binding einer Java-Bibliothek ist eine Anleitung zum Erstellen von Bindings-Bibliotheken für lokal verfügbare .jar/.aar-Dateien.

  • Das Einbinden einer Java-Bibliothek aus Maven ist eine Schritt-für-Schritt-Anleitung zum Erstellen von Bindings Libraries für .jar- und .aar-Dateien, die in einem Maven-Repository gehostet werden.

  • Anpassen von Bindungen erklärt, wie manuelle Änderungen an der Bindung vorgenommen werden, um Buildfehler zu beheben und die resultierende API so zu gestalten, dass sie mehr C#-typisch ist.

  • Bei der Problembehandlung werden allgemeine Bindungsfehlerszenarien aufgeführt, mögliche Ursachen erläutert und Vorschläge zum Beheben dieser Fehler bereitgestellt.