Smart/Origin
  • Solutions
    • Produits
      • Dashboard
      • Cities
      • Citizens
      • Field
    • Usages
      • Informer votre public
      • Observer vos territoires
      • Faciliter les remontées citoyennes
      • Piloter votre organisation
      • Faire participer les citoyens à la vie publique
      • Réinventer les façons de se balader
      • Gérer durablement votre patrimoine arboré
      • Superviser les cours d’eau
  • Expertises
    • Coeur de métier
      • Réalisation d’applications sur-mesure
      • Prestations de services autour des solutions Esri
    • Spécialités
      • Cartographie et data-visualisation
      • Développement web et mobile
      • Expérience utilisateur et design
  • Réalisations
  • Blog
  • Société
    • L’entreprise
    • Recrutement
    • Nous contacter
  • Démo
  • Menu Menu
Tech

Code natif et développement multi-plateformes mobile [2/2]

code-natif

Après vous avoir présenté les différentes solutions existantes pour la création d’applications mobiles multi-plateformes dans un précédent article. Nous vous proposons dans cette article un retour d’expérience, de certaines solutions pour créer des applications multi-plateformes, appliqué à une problématique technique concrète.

Dans le cadre d’une étude technique récente nous nous sommes demandé comment exécuter du code natif dans le cadre d’une application mobile cross-plateforme.

Qu’entend-t-on par « code natif » ?

Par code natif on entend : un code très souvent développé dans un langage bas niveau (proche de la machine) tel que le C++. Ce type de code est employé principalement pour répondre à des contraintes de performance ou d’accès à des composants spécifiques tels que la mémoire ou la carte graphique. Bien que l’utilisation de code natif soit fréquente lors d’un développement iOS avec le langage Objective-C, cette tendance est peu commune sur Android avec le langage Java.

L’introduction récente par Apple du langage Swift et l’utilisation de Java sur Android tend à limiter l’utilisation de code natif afin de simplifier le développement en déléguant à la machine les problématiques de gestion de la mémoire.

En quoi exécuter du code natif dans une application mobile multi-plateforme est une problématique ?

Cette question est tout à fait légitime car les outils de développement proposés par Google et Apple permettent ce type d’exécution, rien ne semble donc freiner cette possibilité. Cependant dans le cadre d’un développement mobile multi-plateformes l’utilisation d’un Framework tend à organiser le développement autour d’un langage haut niveau, tels que C# ou Javascript, et ce afin de faciliter la génération de code spécifique. C’est pourquoi il est moins trivial d’appeler un code natif lorsque le langage utilisé n’est pas C++.

Indépendamment d’un développement multi plateformes comment développe-t-on du code natif pour mobile ?

Sur la plateforme iOS le code natif se présente de diverses manières il peut être proposé via une librairie dynamique (fichier .dylib), un module objective-C (fichier .mm) ou encore une librairie statique (fichier .a).

Sur Android il faut passer par le Native Development Kit (NDK) pour compiler la librairie en fichier .so (librairie dynamique unix). Ensuite il faut effectuer une liaison (binding) via l’interface java native (JNI) entre la librairie dynamique et le code Java métier.

Ce que l’on a cherché à valider

Lors de notre étude technique nous avons cherché à valider l’exécution de code natif via divers frameworks de développement multi-plateformes (Unity, React-Native et Xamarin). Le code natif que nous avons cherché à exécuter se veut très simple : une fonction qui effectue une somme ou une fonction qui retourne une chaine de caractères. Nous avons chercher à exécuter une fonction simple afin de nous concentrer sur la problématique d’appel.

La fonction est encapsulée dans une librairie native que nous aurons compilée via le compilateur C++ adéquat de la plateforme cible.

 

En pratique

Dans cette section nous allons voir comment nous avons réussi à appeler du code natif à partir des différents frameworks ciblés.

1. Unity

Pour les outils, tout se passe avec les IDE Unity et MonoDevlop.

Unity étant destiné au monde du jeu vidéo, il est donc nécessaire de créer une scene (environnement 3D) associé à un asset de type script (C#).

Ensuite il faut ajouter au projet sous forme d’asset les librairies. Pour Android les fichiers .so dans le dossier Plugins/Android/<ABI>/fichier.so et pour iOS Plugins/iOS/fichier.mm et les configurer comme suis :

 

 

Enfin il suffit de charger la librairie en associant une directive de compilation et une directive P/Invoke.

Une fois les fonctions exposées de manière statique il suffit de les appeler dans le code.

La génération de code JNI est transparente avec Unity, néanmoins la compilation des librairies se fera en dehors du projet.

 

1. React-Native

Au niveau des outils, React-Native ne propose pas d’IDE dédié il faudra passer par un éditeur/IDE supportant au minimum ES6 et au mieux ES6, Java, Objective-C.

Pour React-Native l’appel de code natif sera moins trivial que pour Unity il sera d’abord nécessaire de passer par un outil intermédiaire (Djinni) qui va automatiser la compilation du code C++ et la génération de module (iOS) / code JNI (Android).

Ensuite contrairement à Unity il faudra développer les ponts (bridge/binding) entre le code généré par Djinni et le code généré par React Native.

Enfin dans le code javascript React-Native il suffira de charger le module via le package React-Native NativeModules.

 

 

 

 

 

3. Xamarin

En utilisant la dernière version de Visual Studio (PC/Mac) il suffira de créer un projet Xamarin.Forms afin de cibler plusieurs plateformes mobiles.

A partir de ce projet il sera nécessaire de créer dans chaque sous projet cible créé par Xamarin un DependencyService qui implémente une interface définit dans le projet global Xamarin. C’est ensuite dans les implémentations cibles que l’appel à une librairie native se fera, via une directive P/Invoke. Le projet global lui ne fera que des appels de haut niveau en demandant l’interface et non l’implémentation.

 

La compilation des librairies se fera en dehors du projet Xamarin pour Android, pour iOS il faudra ajouter une directive de compilation au projet.

 

Retour d’expérience

Comme on a pu le voir au cour de ce dernier article nous avons obtenu un résultat concluant sur chacune des plateformes avec tous les frameworks testés.

Pour arriver à un résultat avec Unity il nous aura fallu moins d’un jour, une des difficultés rencontrées a été d’utiliser ce frameworks (et ses outils) dans un contexte indépendant du jeu vidéo.

React-Native est clairement l’exemple le plus clé en main que nous ayons produit lors de cette analyse, la génération du code pour une plateforme cible générant également la librairie dynamique. Cependant cette simplicité est coûteuse en temps de configuration (1.5 jour pour arriver à un résultat), nous avons du créer des bindings parfois complexes pour obtenir un tel résultat. De plus, la documentation étant actuellement limitée, aller plus loin que le simple exemple de faisabilité pourra prendre un temps non négligeable.

Avec Xamarin la réalisation d’un exemple aura été assez rapide (1/2 journée) néanmoins la compilation des librairies iOS avec le projet Xamarin n’a pas été évidente à mettre en oeuvre.

 

Pour aller plus loin

Les projets Unity/React-Native/Xamarin réalisés lors de cette analyse sont disponibles en open source sur notre compte github : https://github.com/smartorigin/Cross-platform-mobile-development-samples N’hésitez pas à les manipuler/tester, des README sont là pour vous aider dans la configuration/prise en main de ces différentes technologies.

Smart/Origin vous accompagne dans la création d’applications mobiles innovantes, de l’étude de faisabilité à la livraison sur les différents store.

 

Article rédigé par Marc-Alexandre Blanchard.

Etiquettes : DevOps, React Native, Unity, Xamarin
Partager cette publication
  • Partager sur Facebook
  • Partager sur X
  • Partager sur LinkedIn
  • Partager par Mail
https://smart-origin.com/wp-content/uploads/2018/01/codenatif2_1.jpg 1078 1920 Denis Martin https://smart-origin.com/wp-content/uploads/2019/01/logo-smart-origin-300x138.png Denis Martin2018-01-02 10:58:282019-03-11 11:05:51Code natif et développement multi-plateformes mobile [2/2]
Vous aimerez peut-être aussi
code-natif-appli-mobile Code natif et développement multi-plateforme mobile [1/2]
Drupal Retour d’expérience : création d’un module Drupal
OSM-Buildings-3D-bâtiments-SIG OSM Buildings : valorisez vos bâtiments en 3D dans ArcGIS

Catégories

Cas client (40) Data visualisation (20) Non classé (4) Team (11) Tech (10)

Articles récents

  • Des rapports géomarketing automatisés à partir d’une adresse22 avril 2026 - 16 h 29 min
  • Associer Alfresco et ArcGIS Experience Builder grâce à un widget personnalisé10 janvier 2025 - 10 h 58 min
  • Ma Boussole Territoires, l’observatoire des solutions d’aide pour les aidants5 décembre 2024 - 12 h 04 min
  • Une nouvelle expérience pour les cavaliers : GéoCheval, l’application de randonnée équestre de la FFE29 novembre 2024 - 16 h 45 min
  • Modélisation 3D du territoire de Val d’Europe8 avril 2024 - 17 h 06 min
  • Application cartographique d’extraction de données SIG format DWG, DXF ou SHP5 avril 2024 - 17 h 37 min

Mots clés

alimentation (3) ArcGIS (2) attractivité (12) carte (20) communiquer (12) data (1) data science (4) dataset (1) datavisualisation (1) dataviz (2) design (10) DevOps (4) drupal (1) démocratie participative (1) démo vidéo (3) ergonomie (4) ESRI (8) event (5) google maps (1) géo-décisionnel (2) habitat (4) infographie (1) jeu de donnée (1) logement (3) marketing territorial (9) observatoire (3) open data (7) OpenStreetMap (1) outil métier (1) patrimoine (2) plan alimentaire territorial (1) portail open data (3) React Native (2) salon SIG (5) SEO (1) SIG (4) smart cities (11) success stories (43) territoire (18) tourisme (3) UI (4) UI/UX (1) Unity (2) UX (5) Xamarin (2)

logo-smart-origin-data-visualisation-carte-tableau-de-bord

Société de services en ingénierie logicielle, experte en cartographie et en data visualisation, façonnant des applications sur mesure et des expériences utilisateurs pensées pour s’informer, communiquer, travailler et vivre avec les données.

Expertises

  • Réalisations d’applications sur-mesure
  • Prestations de services autour des solutions Esri

Produits

  • Cities
  • Citizens
  • Dashboard
  • Field

Blog

  • Des rapports géomarketing automatisés à partir d’une adresse22 avril 2026 - 16 h 29 min
  • Associer Alfresco et ArcGIS Experience Builder grâce à un widget personnalisé10 janvier 2025 - 10 h 58 min
  • Ma Boussole Territoires, l’observatoire des solutions d’aide pour les aidants5 décembre 2024 - 12 h 04 min
© Smart/Origin, made with ❤ à Grenoble | contact@smart-origin.com | 04 76 41 16 69
  • Lien vers X
  • Lien vers LinkedIn
  • Politique de confidentialité et mentions légales
Lien vers: Code natif et développement multi-plateforme mobile [1/2] Lien vers: Code natif et développement multi-plateforme mobile [1/2] Code natif et développement multi-plateforme mobile [1/2]code-natif-appli-mobile Lien vers: Retour d’expérience : création d’un module Drupal Lien vers: Retour d’expérience : création d’un module Drupal DrupalRetour d’expérience : création d’un module Drupal
Faire défiler vers le haut Faire défiler vers le haut Faire défiler vers le haut

Nous utilisons des cookies pour nos statistiques de fréquentations. En continuant à utiliser le site, vous acceptez l'utilisation des cookies.

AccepterRefuserEn savoir plus

Cookies et paramètres de confidentialité



Comment nous utilisons les cookies

Nous pouvons demander que les cookies soient mis en place sur votre appareil. Nous utilisons des cookies pour nous faire savoir quand vous visitez nos sites Web, comment vous interagissez avec nous, pour enrichir votre expérience utilisateur, et pour personnaliser votre relation avec notre site Web.

Cliquez sur les différentes rubriques de la catégorie pour en savoir plus. Vous pouvez également modifier certaines de vos préférences. Notez que le blocage de certains types de cookies peut avoir une incidence sur votre expérience sur nos sites Web et les services que nous sommes en mesure d’offrir.

Cookies Web Essentiels

Ces cookies sont strictement nécessaires pour vous délivrer les services disponibles sur notre site et pour utiliser certaines de ses fonctionnalités.

Du fait que ces cookies sont absolument nécessaires au bon rendu du site, les refuser aura un impact sur la façon dont il fonctionne. Vous pouvez toujours bloquer ou effacer les cookies via les options de votre navigateur et forcer leur blocage sur ce site. Mais le message vous demandant de les accepter/refuser reviendra à chaque nouvelle visite sur notre site.

Nous respectons votre choix de refuser les cookies mais pour éviter de vous le demander à chaque page laissez nous en utiliser un pour mémoriser ce choix. Vous êtes libre de revenir sur ce choix quand vous voulez et le modifier pour améliorer votre expérience de navigation. Si vous refusez les cookies nous retirerons tous ceux issus de ce domaine.

Nous vous fournissons une liste de cookies déposés sur votre ordinateur via notre domaine, vous pouvez ainsi voir ce qui y est stocké. Pour des raisons de sécurité nous ne pouvons montrer ou afficher les cookies externes d’autres domaines. Ceux-ci sont accessibles via les options de votre navigateur.

Cookies Google Analytics

Ces cookies collectent des informations de manière compilée pour nous aider à comprendre comment notre site est utilisé et combien son performantes nos actions marketing, ou pour nous aider à personnaliser notre site afin d’améliorer votre expérience de navigation.

Si vous ne souhaitez pas que votre visite soit pistée sur notre site vous pouvez bloquer ce pistage dans votre navigateur ici :

Autres services externes

Nous utilisons également différents services externes comme Google Webfonts, Google Maps, autres hébergeurs de vidéo. Depuis que ces FAI sont susceptibles de collecter des données personnelles comme votre adresse IP nous vous permettons de les bloquer ici. merci de prendre conscience que cela peut hautement réduire certaines fonctionnalités de notre site. Les changement seront appliqués après rechargement de la page.

Réglages des polices Google :

Réglages Google Map :

Réglages reCAPTCHA :

Intégrations de vidéo Vimeo et Youtube :

Autres cookies

Les cookies suivants sont également requis - Vous pouvez choisir d’autoriser leur utilisation :

Politique de Confidentialité

Vous pouvez lire plus de détails à propos des cookies et des paramètres de confidentialité sur notre Page Mentions Légales.

Politique de confidentialité et mentions légales
Accepter les réglagesMasquer uniquement les notifications