Xamarin Bindungsbibliotheken, Android Teil (1/3)

Xamarin Bindungsbibliotheken, Android Teil (1/3)
21/12/2021

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.

1.  Einführung

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.

Abbildung 1 -Struktur der nativen Xamarin-Architektur (Xamarin.Android, Xamarin.iOS)

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.

 

2.  Android Bindungsbibliothek

Um eineBindungsbibliothek für Android zu erstellen, öffnen Sie einfach den Dialog VisualStudio - Neues Projekt erstellen und wählen Sie den Typ "AndroidBindings Library".

Abbildung 2 -Visual Studio Dialog Neues Projekt mit Android Bindungsbibliothek Vorlage

Nach derErstellung sieht das leere Android Bindungsbibliothek Projekt wie in Abbildung 3aus. Es gibt drei Ordner: Additions, Jars und Transforms.

Abbildung 3 -Leere Android Bindungsbibliothek

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:

Abbildung 4 -Quellcode der Klasse Android Bindungsbibliothek, die mit MSBuild von Kotlin nach C# umgewandelt wurde (beim Erstellen des Projekts werden für alle jar/aar-Pakete mit der Build Action LibraryProjectZip im Ordner obj Spiegel-C#-Klassen generiert)

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.

2.1.    Fehlersuche

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).

Abbildung 5 -Screenshot des Java Decompilers in Aktion

2.1.1.      Kodierungsprobleme

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.

2.1.2.      Laufzeitprobleme

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.

 

Teilen:
Luboš ist ein erfahrener .NET-Entwickler (Web und mobile Anwendungen), der mit SQL und DevOps bestens vertraut ist. Er hat zahlreiche Webanwendungen entwickelt, die weltweit von der Industrie und der akademischen Welt genutzt werden. Er hat einen Bachelor-Abschluss in angewandter Physik und Astrophysik. Er spielt gerne Bowling und Geige und fährt E-Mountainbike und Ski.

Article collaborators

SABO Newsletter icon

SABO NEWSLETTER

Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

SABO Mobile IT

Für unsere Kunden aus der Industrie entwickeln wir spezialisierte Software zur Umsetzung von Industry 4.0. IoT, Machine Learning und Künstliche Intelligenz ermöglichen uns, signifikante Effizienzsteigerungen bei unseren Kunden zu erzielen.
Über uns