Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.
.NET pro Android umožňuje to udělat pomocí knihovny vazeb , která automaticky zabalí knihovnu obálkami jazyka C#, abyste mohli vyvolat kód Java prostřednictvím volání jazyka C#.
To se implementuje pomocí Managed Callable Wrappers (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, když kód Android runtime (ART) chce vyvolat spravovaný kód, provádí to prostřednictvím dalšího mostu JNI, známého jako volatelné obálky Androidu (ACW). Tato architektura je znázorněná v následujícím diagramu:
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.contoso.mycode;
public class MyClass
{
public String myMethod (int i) { ... }
}
Jakmile vygenerujeme knihovnu vazeb pro .jar, která obsahuje MyClass, můžeme ji instancovat a volat metody z jazyka C#:
var instance = new MyClass ();
string result = instance.MyMethod (42);
K vytvoření této knihovny vazeb použijete šablonu Android Java Binding Library pro .NET for Android. Výsledný projekt vazby vytvoří sestavení .NET s třídami MCW, .jar.aar/ soubory a prostředky pro projekty knihovny Android vložené do něj. Odkazováním na výsledné sestavení knihovny Bindings Library můžete znovu použít existující knihovnu Java ve svém projektu .NET pro 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. Například pokud je název balíčku Java pro vaše připojené .jar následující:
com.contoso.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ázaného .jar souboru:
using Com.Contoso.Package;
Při svázání existující Android knihovny 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 součástí projektu .NET pro Android prostřednictvím balíčku NuGet nebo jako AndroidLibrary. Všechna nativní sestavení musí být přidána do projektu vazby jako AndroidNativeLibrary.
Jaká verze rozhraní ANDROID API cílí na knihovnu Androidu? – Není možné "downgradovat" úroveň rozhraní ANDROID API; ujistěte se, že projekt vazby .NET pro Android cílí na stejnou úroveň rozhraní API (nebo vyšší) jako knihovna Androidu.
Přizpůsobení rozhraní Java API na C⧣
Generátor vazeb .NET pro 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.
Nasloucháče/rozhraní nasloucháče 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#.
Zahrnutí nativní knihovny do vazby
Může být nutné zahrnout knihovnu .so do projektu vazeb .NET pro Android jako součást vazby knihovny Java. Při spuštění zabaleného Java kódu se .NET pro Android nepodaří provést volání JNI a chybová zpráva java.lang.UnsatisfiedLinkError: Nativní metoda nebyla nalezena: se zobrazí ve výstupu logcat pro aplikaci.
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 .NET pro Android má sdílenou knihovnu libpocketsphinx_jni.so součástí projektu vazby s akcí sestavení AndroidNativeLibrary, 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");
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:
Vytvoření vazební knihovny Java je návod k vytváření vazebních knihoven pro místně dostupné .jar a .aar soubory.
Vytváření vazební knihovny Java z Mavenu je návod pro vytváření vazebních knihoven pro soubory .jar/.aar hostované v úložišti Maven.
Přizpůsobení vazeb vysvětluje, jak provést ruční úpravy vazby pro řešení chyb sestavení a tvarování výsledného rozhraní API tak, aby bylo více "podobné jazyku C#".
Řešení potíží s vazbami uvádí běžné scénáře chyb vazeb, vysvětluje možné příčiny a nabízí návrhy pro řešení těchto chyb.