Vytvoření vazby knihovny Java

Komunita Androidu má mnoho knihoven Java, které můžete chtít použít ve své aplikaci; Tento průvodce vysvětluje, jak začlenit knihovny Java do aplikace Xamarin.Android vytvořením knihovny Bindings Library.

Přehled

Ekosystém knihoven třetích stran pro Android je obrovský. Z tohoto důvodu často dává smysl použít existující knihovnu Androidu, než vytvořit novou. Xamarin.Android nabízí dva způsoby použití těchto knihoven:

  • Vytvořte knihovnu bindings, která automaticky zabalí knihovnu obálkami jazyka C#, abyste mohli vyvolat kód Java prostřednictvím volání jazyka C#.

  • Volání v kódu knihovny Java můžete vyvolat přímo pomocí rozhraní JNI (Java Native Interface). JNI je programovací architektura, která umožňuje volání a volání kódu Java nativními aplikacemi nebo knihovnami.

Tato příručka vysvětluje první možnost: jak vytvořit knihovnu vazeb, která zabalí jednu nebo více existujících knihoven Java do sestavení, na které můžete vytvořit propojení ve vaší aplikaci. Další informace o použití JNI naleznete v tématu Práce s JNI.

Xamarin.Android implementuje vazby pomocí spravovaných obálkových volání (MCW). MCW je most JNI, který se používá, když spravovaný kód potřebuje vyvolat kód Java. Spravované obálky s možností volání také poskytují podporu pro podtřídy typů Java a přepsání virtuálních metod u typů Javy. Stejně tak platí, že pokaždé, když kód MODULU RUNTIME (ART) pro Android chce vyvolat spravovaný kód, provede to prostřednictvím jiného mostu JNI, který se označuje jako volatelné obálky (ACW). Tato architektura je znázorněná v následujícím diagramu:

Android JNI bridge architecture

Knihovna vazeb je sestavení obsahující spravované obálky s možností volání pro typy Java. Tady je například typ Java, MyClasskterý chceme zabalit do knihovny vazeb:

package com.xamarin.mycode;

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

Jakmile vygenerujeme knihovnu vazeb pro .jar , která obsahuje MyClass, můžeme ji vytvořit instanci a volat metody z jazyka C#:

var instance = new MyClass ();

string result = instance.MyMethod (42);

Chcete-li vytvořit tuto knihovnu vazeb, použijte šablonu knihovny vazeb Jazyka Java pro Xamarin.Android. Výsledný projekt vazby vytvoří sestavení .NET s třídami MCW, .jar soubory a prostředky pro projekty knihovny Android vložené do něj. Můžete také vytvořit knihovny vazeb pro archiv Androidu (. Soubory AAR) a projekty knihovny Eclipse pro Android. Odkazováním na výsledné sestavení knihovny DLL knihovny Bindings můžete znovu použít existující knihovnu Java v projektu Xamarin.Android.

Při odkazování na typy v knihovně vazeb musíte použít obor názvů vaší knihovny vazeb. Obvykle přidáte direktivu using na začátek zdrojových souborů jazyka C#, která je verzí oboru názvů .NET názvu balíčku Java. Pokud je například název balíčku Java pro vázanou .jar následující:

com.company.package

Potom byste do horní části zdrojových souborů jazyka C# umístili následující using příkaz pro přístup k typům v vázaném souboru .jar :

using Com.Company.Package;

Při vytváření vazby existující knihovny Pro Android je nutné mít na paměti následující body:

  • Existují pro knihovnu nějaké externí závislosti? – Všechny závislosti Javy vyžadované knihovnou Androidu musí být zahrnuty do projektu Xamarin.Android jako ReferenceJar nebo jako EmbeddedReferenceJar. Všechna nativní sestavení musí být přidána do projektu vazby jako EmbeddedNativeLibrary.

  • Jaká verze rozhraní ANDROID API cílí na knihovnu Androidu? – Není možné "downgradovat" úroveň rozhraní ANDROID API; ujistěte se, že projekt vazby Xamarin.Android cílí na stejnou úroveň rozhraní API (nebo vyšší) jako knihovna Androidu.

  • Jakou verzi sady JDK jste použili ke kompilaci knihovny? – K chybám vazby může dojít v případě, že byla knihovna Android vytvořena s jinou verzí sady JDK, než používá Xamarin.Android. Pokud je to možné, překompilujte knihovnu Pro Android pomocí stejné verze sady JDK, kterou používá vaše instalace Xamarin.Android.

Akce sestavení

Při vytváření knihovny vazeb nastavíte akce sestavení na .jar nebo . Soubory AAR, které začleníte do projektu knihovny Bindings – každá akce sestavení určuje, jak .jar nebo . Soubor AAR se vloží do knihovny vazeb (nebo na který odkazuje). Následující seznam shrnuje tyto akce sestavení:

  • EmbeddedJar – Vloží .jar do výsledné knihovny DLL knihovny vazeb jako vložený prostředek. Jedná se o nejjednodušší a nejčastěji používanou akci sestavení. Tuto možnost použijte, pokud chcete , aby se .jar automaticky zkompiloval do bajtového kódu a zabalil do knihovny vazeb.

  • InputJar – Nevkládá .jar do výsledné knihovny vazeb .DLL. Knihovna vazeb .DLL bude mít závislost na tomto .jar za běhu. Tuto možnost použijte, pokud nechcete zahrnout .jar do knihovny vazeb (například z důvodů licencování). Pokud použijete tuto možnost, musíte zajistit, aby byl vstupní .jar dostupný na zařízení, na kterém běží vaše aplikace.

  • LibraryProjectZip – Vloží . Soubor AAR do výsledné knihovny vazeb .DLL. To se podobá EmbeddedJar, s tím rozdílem, že máte přístup k prostředkům (stejně jako kód) vázaný . Soubor AAR. Tuto možnost použijte, pokud chcete vložit . AAR do knihovny vazeb

  • ReferenceJar– Určuje .jar odkazu: odkaz .jar je .jar, že jeden z vašich svázaných .jar nebo . Soubory AAR závisí na. Tento referenční .jar slouží pouze k uspokojení závislostí v době kompilace. Při použití této akce sestavení se vazby jazyka C# pro referenční .jar nevytvořily a nejsou vloženy do výsledné knihovny vazeb .DLL. Tuto možnost použijte, když vytvoříte knihovnu vazeb pro referenční .jar , ale ještě jste to neudělali. Tato akce sestavení je užitečná pro balení více .jar(a/nebo ). AARS) do více vzájemně závislých knihoven vazeb.

  • EmbeddedReferenceJar – Vloží odkaz .jar do výsledné knihovny vazeb .DLL. Tuto akci sestavení použijte, pokud chcete vytvořit vazby jazyka C# pro vstupní .jar (nebo . AAR) a všechny odkazy .jar ve vaší knihovně vazeb.

  • EmbeddedNativeLibrary – Vloží do vazby nativní .so . Tato akce sestavení se používá pro soubory .so , které jsou vyžadovány .jar souborem, který je vázán. Před spuštěním kódu z knihovny Java může být nutné knihovnu .so načíst ručně. Toto je popsáno níže.

Tyto akce sestavení jsou podrobněji vysvětleny v následujících příručkách.

Kromě toho se používají následující akce sestavení, které vám pomůžou importovat dokumentaci k rozhraní Java API a převést je do dokumentace XML jazyka C#:

  • JavaDocJar slouží k odkazování na soubor Jar javadoc archivu pro knihovnu Java, která odpovídá stylu balíčku Maven (obvykle FOOBAR-javadoc**.jar**).
  • JavaDocIndex slouží k odkazování na index.html soubor v referenční dokumentaci k rozhraní API HTML.
  • JavaSourceJar se používá k doplnění JavaDocJar, k prvnímu vygenerování JavaDoc ze zdrojů a následné zacházení s výsledky jako JavaDocIndex, pro knihovnu Java, která odpovídá stylu balíčku Maven (obvykle FOOBAR-sources**.jar**).

Dokumentace k rozhraní API by měla být výchozí doclet ze sady Java8, Java7 nebo Java6 SDK (jsou všechny různé formáty) nebo stylu DroidDoc.

Zahrnutí nativní knihovny do vazby

Může být nutné zahrnout knihovnu .so do projektu vazeb Xamarin.Android jako součást vazby knihovny Java. Když se zabalený kód Java spustí, Xamarin.Android neprovede volání JNI a chybovou zprávu java.lang.UnsatisfiedLinkError: Nativní metoda nebyla nalezena: zobrazí se v odhlašovacím příkazu aplikace.

Oprava tohoto problému spočívá v ručním načtení knihovny .so s voláním Java.Lang.JavaSystem.LoadLibrary. Předpokládejme například, že projekt Xamarin.Android má sdílenou knihovnu libpocketsphinx_jni.so součástí vazbového projektu s akcí sestavení EmbeddedNativeLibrary, následující fragment kódu (spuštěn před použitím sdílené knihovny) načte knihovnu .so:

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

Přizpůsobení rozhraní Java API na C⧣

Generátor vazeb Xamarin.Android změní některé idiomy a vzory Jazyka Java tak, aby odpovídaly vzorům .NET. Následující seznam popisuje, jak se Java mapuje na C#/.NET:

  • Metody Setter/Getter v Javě jsou vlastnosti v .NET.

  • Pole v Javě jsou vlastnosti v .NET.

  • Rozhraní naslouchacího procesu a naslouchacího procesu v Javě jsou události v .NET. Parametry metod v rozhraních zpětného volání budou reprezentovány podtřídou EventArgs .

  • StaticKá vnořená třída v Javě je vnořená třída v .NET.

  • Vnitřní třída v Javě je vnořená třída s konstruktorem instance v jazyce C#.

Scénáře vazeb

Následující průvodci scénářem vazeb vám můžou pomoct svázat knihovnu Java (nebo knihovny) pro začlenění do vaší aplikace: