Dieser Artikel behandelt die allgemeine Erstellung und Verwendung der sogenannten Bindungsbibliotheken für Xamarin oder .NET Mobile Apps. Die Bindungsbibliothek bietet .NET Entwicklern die Möglichkeit, native Bibliotheken zu nutzen, die inObjective-C / Swift für iOS oder in Java / Kotlin für Android-Apps geschrieben wurden. Am Ende des Artikels finden Sie ein Beispiel aus der Praxis, das wir bei SABO Mobile IT erstellt haben.
Die Xamarin-Technologie bietet .NET-Entwicklern die Möglichkeit, großartige und schnelle nativeAnwendungen für Smartphones und Tablets zu erstellen. Mit Xamarin können .NET-EntwicklerCode in C# schreiben und BCL (Base Class Library) und andere .NET-APIs verwenden.Xamarin bindet intern die genannten .NET APIs an Android/Java-Klassen auf dem Android-Betriebssystem oder iOS APIs auf dem iOS Betriebssystem.
Auf diese Weise können .NET-Entwickler ihre eigenen nativen Anwendungen erstellen und dabei alle Funktionen nutzen, die von Android/Java-Bibliotheken bzw. iOS Bibliotheken angeboten werden.
In der Praxis gibtes jedoch eine Vielzahl von Funktionen, die bereits von Android/iOS-Entwicklern kodiert wurden. Diese Funktionen sind in so genannten Bibliotheken vonDrittanbietern gruppiert. Bei diesen Bibliotheken kann es sich um Treiber,Bildmanipulatoren, gerätespezifische SPIs (Serial Peripheral Interface), APIs für Drittanbieterdienste usw. handeln.
Die nativen Bibliotheken von Drittanbietern können in Java oder Kotlin für Android und Objective-C oderSwift für iOS geschrieben werden. Das bedeutet leider, dass solche Bibliotheken nicht mit der C#/.NET-Umgebung kompatibel sind.
Glücklicherweise bietet das Xamarin Team eine großartige Funktion, die die Nutzung dieser Bibliotheken von Drittanbietern ermöglicht - die so genannten Bindungsbibliotheken.
Schauen wir uns an, wie man die Bindungsbibliothek für Xamarin.Android und Xamarin.iOS erstellt und verwendet.
Um eineBindungsbibliothek für Android zu erstellen, öffnen Sie einfach den Dialog VisualStudio - Neues Projekt erstellen und wählen Sie den Typ "AndroidBindings Library".
Nach derErstellung sieht das leere Android Bindungsbibliothek Projekt wie in Abbildung 3aus. Es gibt drei Ordner: Additions, Jars und Transforms.
In den Jars Ordner sollten alle kompilierten .jar-Dateien oder .aar-Archive abgelegt werden -die nativen Java-Bibliotheken selbst. Die Bibliothek, für die Sie Bindungen erstellen, muss die Build Action in der Eigenschaftsleiste auf "LibraryProjectZip"eingestellt haben, während zusätzliche Referenz-.jar-Dateien, die von der gebundenen Bibliothek benötigt werden, in Visual Studio die Build Action au "EmbededReferenceJar" eingestellt haben müssen. Das bedeutet, dass die .jar-Referenz in die resultierende .dll-Datei aufgenommen wird.
Weitere Informationen zu Build Actions für Android Bindings Library Projektefinden Sie hier [4].
Der Transforms Ordner enthält drei XML-Dateien, die beim Übersetzen von Java-Code in C# verwendet werden. Diese Transformationen sind vor allem dann notwendig, wenn Android BindungsbibliothekProjekte aufgrund von C# Kompilierungsfehlern nicht erstellt werden können.Abhängig von der verwendeten C#-Version und der Java-Version, in der dieOriginalbibliothek geschrieben ist, kann die Übersetzung zu Kompilierungsfehlernführen. Wenn dies geschieht, fügen Sie die Transformationsanpassung in dieDatei Metadata.xml ein.
Transformationen werden mit dem XPath Syntax geschrieben. XPath verwendet Pfadausdrücke, umKnoten oder Knotengruppen in einem XML-Dokument auszuwählen. Zum Beispiel:
{% c-block language="xml" %}
<attr path="/api/package[@name='com.namespace.sdk']/class[@name='StackProps']/method[@name='copy' and count(parameter)=2 and parameter[1][@type='boolean'] and parameter[2][@type='com.namespace.sdk.services.TCFStack']]/parameter[@name='checked']" name="name">isChecked</attr>
{% c-block-end %}
Eine große Hilfebeim Schreiben von benutzerdefinierten Transformationen befindet sich direkt im generierten Quellcode - über jedem Klassenmitglied:
Diese Zeilefindet eine Methode mit zwei Parametern im Java-Code com.namespace.sdk.StackProps.copy(paramater1, checked) und benennt den Namen des zweiten Parameters von"checked" in "isChecked" um. Diese Umwandlung ist notwendig, weil "checked" ein reserviertes Wort in C# ist und nicht als Parameter name verwendet werden kann.
Wenn alle notwendigen Transformationen geschrieben werden und der Aufbau des Android BindungsbibliothekProjekts gelingt, erhalten wir als Ergebnis eine .dll-Datei der gebundenenBibliothek, die in unserem Xamarin Projekt referenziert werden kann.
In wirklichenLeben kann es zu Problemen beim Entwurf oder zur Laufzeit kommen. Die Lösung von Problemen bei der Transformation und der Verwendung der Bibliothek ist einfacher, wenn Sie sich den dekompilierten Java Quellcode ansehen können. Ich empfehle die Verwendung der Utility Java Decompiler, das kostenlos heruntergeladen werden kann (siehe Referenz links unter diesem Artikel).
Bei der Verwendung der gebundenen Bibliothek kann das Problem auftreten, dass angeforderteMethoden oder Mitglieder in der übersetzten Bibliothek fehlen. Dies wird normalerweise durch fehlende native Referenzen verursacht. In der obigenAbbildung sind dem Java-Compiler zum Beispiel keine Typen aus kotlin.* bekannt.Die Bibliothek ist in Kotlin und nicht in Java geschrieben. Um das Problem mit den fehlenden Typen zu lösen, binden Sie das NuGet Paket Xamarin.Kotlin.StdLib in das Android Bindungsbibliothek Projekt ein.
Wenn Sie dieBibliothek verwenden und die Xamarin Anwendung ausführen, können Probleme mitder Laufzeit auftreten und die Anwendung stürzt ab. Dies kann auf fehlende.jar-Referenzen zurückzuführen sein, die intern im ursprünglichen .aar-Archivverwendet werden, aber hier nicht direkt eingebettet sind. Dann müssen wir die fehlende .jar-Referenz finden und sie in den Jars Ordner einfügen, wobei die Build Action auf EmbeddedReferenceJar eingestellt ist.