Java-kódtárak kötése

Az Android külső könyvtári ökoszisztémája hatalmas. Emiatt gyakran van értelme meglévő Android-kódtárat használni, mint újat létrehozni.

Az Androidhoz készült .NET lehetővé teszi ezt egy kötéstárral , amely automatikusan C# burkolókkal burkolja a kódtárat, így C# hívásokon keresztül meghívhatja a Java-kódot.

Ezt felügyelt hívható burkolókkal (MCW) valósítjuk meg. Az MCW egy JNI-híd, amelyet akkor használnak, amikor a felügyelt kódnak Meg kell hívnia a Java-kódot. A felügyelt hívható burkolók támogatják a Java-típusok alosztályozását és a Java-típusok virtuális módszereinek felülírását is. Hasonlóképpen, amikor az Android futtatókörnyezeti (ART) kód felügyelt kódot szeretne meghívni, ezt egy másik JNI-hídon, az Android Callable Burkolóin (ACW) keresztül teszi. Ez az architektúra az alábbi ábrán látható:

Android JNI-híd architektúrája

A Bindings Library egy gyűjtemény, amely Java-típusokhoz tartozó Managed Callable Wrappers-t tartalmaz. Például itt van egy Java-típus, MyClass, amelyet egy Bindings könyvtárba szeretnénk csomagolni.

package com.contoso.mycode;

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

Miután létrehoztunk egy Binding Library-t a .jar fájlhoz, amely tartalmazza a MyClass, példányosíthatjuk, és C#-ból meghívhatunk rajta metódusokat.

var instance = new MyClass ();

string result = instance.MyMethod (42);

A Bindings Library létrehozásához a .NET for Android Android Java Binding Library sablont kell használnia. Az eredményül kapott binding projekt létrehoz egy .NET assembly-t az MCW osztályokkal, .jar/.aar fájl(ok)kal és az Android Library projektekbe beágyazott erőforrásokkal. Az eredményül kapott Kötéstár-szerelvényre való hivatkozással újra felhasználhat egy meglévő Java-kódtárat az Android-alapú .NET-projektben.

Amikor a kötéstárban típusokra hivatkozik, a kötéstár névterét kell használnia. Általában a C#-forrásfájlok tetején egy direktívát ad hozzá using , amely a Java-csomag nevének .NET-névtérverziója. Ha például a kötött .jar Java-csomag neve a következő:

com.contoso.package

Ezután a következő using utasítást kell elhelyeznie a C#-forrásfájlok tetején a kötött .jar fájl típusainak eléréséhez:

using Com.Contoso.Package;

Meglévő Android-kódtár kötésekor a következő szempontokat kell szem előtt tartani:

  • Vannak külső függőségek a könyvtárhoz? – Az Android-kódtár által igényelt Java-függőségeket NuGet-csomagon vagy AndroidLibraryként kell szerepeltetni a .NET for Android-projektben. A natív szerelvényeket AndroidNativeLibraryként kell hozzáadni a kötési projekthez.

  • Az Android API melyik verzióját célozza meg az Android-kódtár? – Az Android API-szintjét nem lehet "leminősíteni"; győződjön meg arról, hogy az Androidhoz készült .NET kötési projekt ugyanazt (vagy magasabb) API-szintet célozza meg, mint az Android könyvtár.

Java API-k adaptálása C⧣-hez

Az Androidhoz készült .NET kötésgenerátor módosít néhány Java-kifejezést és mintát, hogy azok megfeleljenek a .NET-mintáknak. Az alábbi lista a Java C#/.NET-re való leképezését ismerteti:

  • A Java-ban a Setter/Getter metódusoka .NET-ben lévő tulajdonságok .

  • A mezők a Javábantulajdonságok a .NET-ben.

  • A Java figyelői/figyelői felületei a .NET eseményei . A visszahívási felületek metódusainak paramétereit egy EventArgs alosztály jelöli.

  • A Java statikus beágyazott osztálya egy beágyazott osztály a .NET-ben.

  • A Java egyik belső osztálya egy beágyazott osztály , amelyben egy példánykonstruktor található C#-ban.

Natív könyvtár felvétele az összekapcsolásba

Előfordulhat, hogy a Java-kódtárak kötésének részeként . so kódtárat is be kell vonni egy .NET for Android-kötési projektbe. A becsomagolt Java-kód végrehajtásakor az Androidhoz készült .NET-nek nem sikerül végrehajtani a JNI-hívást, és a következő hibaüzenet jelenik meg a logcat kimenetében: java.lang.UnsatisfiedLinkError: Native metódus nem található:.

Ennek javítása az, hogy manuálisan betölti a .so könyvtárat egy hívással Java.Lang.JavaSystem.LoadLibrary. Ha például feltételezzük, hogy egy .NET for Android-projekt megosztott könyvtára, a libpocketsphinx_jni.so, szerepel a kötési projektben az AndroidNativeLibrary építési műveletként, a következő kódrészlet (a megosztott könyvtár használata előtt végrehajtva) betölti a .so könyvtárat:

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

Kötési forgatókönyvek

A következő kötési forgatókönyv-útmutatók segítséget nyújtanak egy Java-kódtár (vagy -kódtár) kötésében az alkalmazásba való beépítéshez: