Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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:
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.