Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
L’écosystème de bibliothèques tiers pour Android est massif. En raison de cela, il est fréquemment judicieux d’utiliser une bibliothèque Android existante que de créer une nouvelle bibliothèque.
.NET pour Android vous permet d’effectuer cette opération avec une bibliothèque bindings qui encapsule automatiquement la bibliothèque avec des wrappers C# afin de pouvoir appeler du code Java via des appels C#.
Cette opération est implémentée à l’aide de wrappers gérés appelables (MCW). MCW est un pont JNI utilisé lorsque le code managé doit appeler du code Java. Les wrappers d'appels gérés prennent également en charge la sous-classification des types Java et la surcharge de méthodes virtuelles sur les types Java. De même, chaque fois que le code d'exécution d'Android (ART) souhaite appeler du code managé, il le fait via un autre pont JNI connu sous le nom de Android Callable Wrappers (ACW). Cette architecture est illustrée dans le diagramme suivant :
Une bibliothèque de liaisons est un assemblage contenant des wrappers gérés appelables pour les types Java. Par exemple, voici un type Java, MyClassque nous voulons encapsuler dans une bibliothèque bindings :
package com.contoso.mycode;
public class MyClass
{
public String myMethod (int i) { ... }
}
Après avoir généré une bibliothèque bindings pour l '.jar qui contient MyClass, nous pouvons l’instancier et appeler des méthodes sur celle-ci à partir de C# :
var instance = new MyClass ();
string result = instance.MyMethod (42);
Pour créer cette bibliothèque de liaisons, vous utilisez le modèle Bibliothèque de liaison Java Android .NET pour Android. Le projet de liaison résultant crée un assembly .NET avec les classes MCW, les fichiers .jar/.aar et les ressources pour les projets de bibliothèque Android qui y sont intégrés. En référençant l’assembly bindings Library résultant, vous pouvez réutiliser une bibliothèque Java existante dans votre projet .NET pour Android.
Lorsque vous référencez des types dans votre bibliothèque de liaisons, vous devez utiliser l’espace de noms de votre bibliothèque de liaisons. En règle générale, vous ajoutez une using directive en haut de vos fichiers sources C# qui est la version de l’espace de noms .NET du nom du package Java. Par exemple, si le nom du package Java pour votre .jar associé est le suivant :
com.contoso.package
Ensuite, vous placez l’instruction suivante using en haut de vos fichiers sources C# pour accéder aux types dans le fichier .jar lié :
using Com.Contoso.Package;
Lors de la liaison d’une bibliothèque Android existante, il est nécessaire de garder à l’esprit les points suivants :
Existe-t-il des dépendances externes pour la bibliothèque ? : toutes les dépendances Java requises par la bibliothèque Android doivent être incluses dans le projet .NET pour Android via un package NuGet ou en tant que AndroidLibrary. Tous les assemblys natifs doivent être ajoutés au projet de liaison en tant qu’AndroidNativeLibrary.
Quelle version de l’API Android cible-t-elle la bibliothèque Android ? – Il n’est pas possible de « rétrograder » le niveau de l’API Android ; vérifiez que le projet de liaison .NET pour Android cible le même niveau d’API (ou version ultérieure) que la bibliothèque Android.
Adaptation des API Java à C⧣
Le générateur de liaison .NET pour Android modifie certains modèles et idiomes Java pour qu’ils correspondent aux modèles .NET. La liste suivante décrit comment Java est mappé à C#/.NET :
Les méthodes Setter/Getter dans Java sont des propriétés dans .NET.
Les champs en Java sont des propriétés dans .NET.
Les écouteurs/interfaces d’écouteur dans Java sont des événements dans .NET. Les paramètres des méthodes dans les interfaces de rappel sont représentés par une
EventArgssous-classe.Une Classe imbriquée statique en Java est une Classe imbriquée dans .NET.
Une classe interne en Java est une classe imbriquée avec un constructeur d’instance en C#.
Inclusion d’une bibliothèque native dans une liaison
Il peut être nécessaire d’inclure une bibliothèque .so dans un projet de liaison .NET pour Android dans le cadre de la liaison d’une bibliothèque Java. Lorsque le code Java encapsulé s’exécute, .NET pour Android ne parvient pas à effectuer l’appel JNI et le message d'erreur java.lang.UnsatisfiedLinkError : méthode native introuvable : apparaît dans le logcat de l’application.
Le correctif de ce problème consiste à charger manuellement la bibliothèque .so avec un appel à Java.Lang.JavaSystem.LoadLibrary. Par exemple, en supposant qu’un projet .NET pour Android a une bibliothèque partagée libpocketsphinx_jni.so inclus dans le projet de liaison avec une action de génération d’AndroidNativeLibrary, l’extrait de code suivant (exécuté avant d’utiliser la bibliothèque partagée) charge la bibliothèque .so :
Java.Lang.JavaSystem.LoadLibrary("pocketsphinx_jni");
Scénarios de liaison
Les guides de scénario de liaison suivants peuvent vous aider à lier une bibliothèque Java (ou bibliothèques) pour l’incorporation dans votre application :
L'association d'une bibliothèque Java est un guide détaillé pour créer des bibliothèques de liaison pour les fichiers locaux .jar/ et .aar.
L'association d’une bibliothèque Java à partir de Maven est une procédure pas à pas pour créer des bibliothèques de liaisons pour les fichiers .jar/.aar hébergés dans un référentiel Maven.
La personnalisation des liaisons explique comment apporter des modifications manuelles à la liaison pour résoudre les erreurs de génération et mettre en forme l’API résultante afin qu’elle soit plus « C#-like ».
La résolution des problèmes de liaisons répertorie les scénarios d’erreur de liaison courants, explique les causes possibles et propose des suggestions pour résoudre ces erreurs.