92 votes

Pourquoi une application Android ne pourrait-elle pas être écrite en C/C++ parce que vous "préférez simplement programmer en C/C++" ?

Mise à jour de (par souci de clarté et pour réduire les ambiguïtés) :

Je vais commencer à bricoler des applications Android. J'avais prévu de les écrire en C++ en utilisant le NDK (puisque j'ai plus d'expérience en C++ et que je le préfère à Java) mais je suis tombé sur ce qui suit sur le site de l Page Android NDK :

vous ne devez utiliser le NDK que s'il est essentiel à votre application. application- jamais parce que vous préférez simplement programmer en C/C++.

J'avais l'impression que vous deviez utiliser la langue que vous préférez, pour autant qu'elle soit adaptée au poste. Quelqu'un pourrait-il expliquer pourquoi il est si fortement déconseillé d'utiliser C/C++ pour le développement Android ?


Original :

Je vais commencer à bricoler des applications mobiles, en particulier Android qui est le système d'exploitation de mon téléphone actuel, et je me demandais si écrire l'application en C++ (ou au moins le noyau, puis l'envelopper en Java) était une option acceptable.

Je suis étudiant en informatique et j'ai suivi trois cours de C++ (intro, intermédiaire, OOP, et je suivrai un cours de STL au printemps) et un seul cours de Java (intermédiaire). De ce fait, je suis plus à l'aise avec le C++ et je le préfère à Java. Je suis tombé sur le texte suivant sur le site Page Android NDK :

L'utilisation de code natif sur Android n'entraîne généralement pas d'amélioration notable des performances. amélioration sensible des performances, mais elle augmente toujours la complexité de votre application. En général, vous ne devriez utiliser le NDK que s'il est essentiel pour votre application. application- jamais parce que vous préférez simplement programmer en C/C++.

  • J'avais l'impression que vous deviez utiliser la langue qui convient à l'emploi ainsi qu'une langue que vous connaissez bien.
  • Je peux vouloir porter l'application sur une autre plateforme mobile, telle que comme iOS, qui supporte C++ mais pas java.
  • Alors que Java est un langage de haut niveau et devrait donc permettre un développement plus rapide, j'ai l'impression que le développement serait plus lent car je devrais réapprendre presque tout (puisque je n'ai suivi qu'un cours sur le langage) le langage)

Tout conseil serait très apprécié.

ps : beaucoup de réponses sur ce sujet datent d'il y a plusieurs années et il y a très peu de réponses qui mentionnent que le NDK permet le développement d'applications natives complètes sur Android 2.3 et plus récent.

1 votes

"Acceptable" est un mot étrange - c'est certainement possible via le NDK ...

1 votes

Vous feriez probablement mieux de prendre le taureau par les cornes et d'apprendre Java. La boîte à outils Android est vraiment destinée à être utilisée à partir de Java, et le temps que vous économiseriez en connaissant déjà le C++ serait dépensé à essayer de comprendre comment faire fonctionner tous les trucs Android à partir du C++. Considérez cela comme une opportunité d'apprentissage :)

0 votes

Personnellement, je mordrais la balle comme Jeremy l'a dit et j'apprendrais simplement ce que vous devez faire avec Java. En fait, ça ne devrait pas être que Il est important que vous l'appreniez relativement vite.

114voto

Devunwired Points 27023

Pensez-y de cette façon. Avec le SDK Java, vous avez la possibilité de créer une application fonctionnelle complète qui tire parti de 100 % des API disponibles pour les développeurs. Il n'y a rien que vous puissiez faire avec le NDK qui ne puisse être fait avec le SDK (du point de vue des API), le NDK offre simplement de meilleures performances.

Regardez maintenant à l'inverse. Si vous choisissez d'écrire une application 100 % dans le NDK, vous pouvez toujours écrire une application entièrement fonctionnelle, mais vous êtes limité dans le nombre d'API du framework auxquelles vous pouvez accéder. L'ensemble du framework Android n'est pas accessible au niveau de la couche native ; la plupart des API sont réservées à Java. Cela ne signifie pas pour autant que toutes les API VOUS dont vous pourriez avoir besoin ne sont pas disponibles dans le NDK, mais loin de là. TOUTES les API sont exposées.

En outre, le NDK introduit du code spécifique à la plate-forme, ce qui augmente la taille de votre distribution. Pour chaque architecture de périphérique que vous avez l'intention de prendre en charge, votre code natif doit être construit dans des fichiers .so (un pour armv5, armv7 et x86) tous regroupés dans le même APK. Cette duplication du code exécutable fait que votre application est trois fois plus volumineuse (c'est un "fat binary"), à moins que vous ne vous chargiez de créer des APK séparés pour chaque architecture lorsque vous distribuez l'application. Le processus de déploiement devient donc un peu plus laborieux si vous ne voulez pas que la taille de votre APK augmente de manière significative.

Encore une fois, si rien de tout cela ne vous empêche de faire ce que vous voulez, cela montre pourquoi Google décrit Java comme la méthode "préférée" pour la majorité de votre code et le chemin de moindre résistance. J'espère que cela vous permettra de comprendre pourquoi la documentation est formulée de la sorte.

1 votes

Merci beaucoup ! Le changement de perspective était la grande partie qui me manquait. Je n'étais pas conscient que le NDK manquait de certaines API. Je n'avais pas non plus pensé à la taille de la distribution, mais cela prend tout son sens maintenant que vous y avez pensé (notamment parce que c++ doit inclure toutes les bibliothèques standard alors que les bibliothèques standard de Java sont déjà présentes sur les appareils). Pourriez-vous nous expliquer un peu plus en quoi consiste le .so fichiers ? Je suis conscient qu'il doit y avoir une compilation séparée du code natif pour chaque architecture matérielle supportée, de sorte que chaque fichier de l'architecture n'a pas besoin d'être compilé. .so Les fichiers ont une compilation séparée ?

48 votes

La restriction du NDK est en fait dommage. J'aimerais beaucoup écrire du code performant pour les plateformes mobiles, principalement pour des raisons d'autonomie de la batterie. Native questions sur les plateformes mobiles. Pourquoi ne pas mieux le soutenir ? #

3 votes

@LoganBesecker La chaîne d'outils NDK compilera de manière croisée votre code dans une .so pour chaque architecture que vous avez choisi de supporter (ceci est contrôlé par vos makefiles), et tous les fichiers seront placés dans le répertoire libs/ de votre APK. Lorsque l'APK est installé, seuls les fichiers appropriés de l'APK seront installés. .so seront sélectionnés, mais ils devront tous être présents dans l'APK initial.

25voto

Isaac Points 8187

Si vous ne comptez développer qu'une seule application dans votre vie, utilisez le NDK.

Si vous souhaitez apprendre le développement Android avec l'intention de développer plus d'une application au cours de votre vie - et si vous voulez être en mesure de les prendre toutes en charge correctement - il est fort probable que vous fassiez mieux à long terme si vous apprenez Java et utilisez plutôt le SDK Java d'Android.

0 votes

Cette logique a beaucoup de sens pratique.

8voto

JAkerblom Points 129

Les programmeurs de King utilisent C++ pour leur logique de jeu. Et ils semblent s'en sortir à en juger par leur chiffre d'affaires.

D'après mon expérience, C++ est pour ceux qui résolvent les problèmes et Java pour ceux qui les évitent. J'aime les deux langages, mais le C++ est très gratifiant lorsque vous écrivez un bon code. Cependant, il faut parfois plusieurs moments de magie pour y arriver.

Vous pouvez également recommander le C++ aux spécialistes des données, qui utilisent normalement Python ou R pour faire leur travail. Le C++ peut faire la même chose avec des performances aussi bonnes, voire meilleures, mais il faut être un génie du langage. C'est pourquoi je ne ferais jamais no Je recommanderais C++ à celui qui veut le faire - je préviendrais simplement le client qu'il est dans le coup.

4voto

Moussa D. Points 59

J'ai trouvé cet article intéressant de : http://betanews.com/2014/07/22/why-c-is-the-perfect-choice-for-modern-app-development/

Le C++ a été conçu spécifiquement pour être indépendant des plates-formes et, à ce titre, il est présent sur tous les systèmes d'exploitation existants. L'utilisateur typique de téléphones mobiles sait peut-être que les applications Android sont écrites en Java et les applications iOS en Objective-C, mais ce que beaucoup ignorent, c'est que la mémoire de vos appareils contient plus de code C/C++ que toute autre chose. Le C/C++ est à l'origine d'une grande partie de la technologie des petits appareils (comme le noyau, qui interagit avec le matériel, ainsi que les bibliothèques d'exécution typiques) et des réseaux de télécommunications qui permettent ces appareils. Plus important encore pour une équipe de développement, il existe des interfaces et des bibliothèques C/C++ pour tout ce que vous devez faire sur n'importe quel appareil et n'importe quelle plate-forme. L'ensemble d'outils Android NDK est un excellent exemple de support C/C++ complet, ajouté à l'origine pour les équipes de développement de jeux afin de leur permettre d'obtenir les meilleures performances possibles de l'appareil en évitant Java et le Dalvik, la machine virtuelle sur laquelle le code Java d'Android est exécuté. Il a été régulièrement amélioré pour permettre l'utilisation de tous les services Android.

4voto

Lawrence Dol Points 27976

La considération la plus importante est que le code Java compilé fonctionnera sur tous les appareils Android sans changement, alors que le code natif devra être compilé pour toutes les plateformes cibles.

L'intention générale de Java et d'Android est d'écrire la majorité, sinon la totalité, de votre application en Java et de n'utiliser les éléments natifs que lorsqu'il n'y a pas d'autre option... donc tout ce qui concerne l'écriture de l'application se prête à l'utilisation de Java.

En écrivant en Java, vous vous épargnerez bien des tracas pour faire le lien entre le monde natif et le monde Java.

En outre, vous vous rendrez un grand service si vous vous lancez dans l'apprentissage de Java. Non seulement votre application Android n'en sera que meilleure, mais vous vous exposerez à une approche sensiblement différente de l'OO et vous serez un meilleur programmeur.

Ajoutez à cela le fait que vous éviterez toute une série de risques de sécurité en écrivant en Java.

Dans mon esprit, c'est une évidence : utilisez Java.

2 votes

"...et n'utiliser les choses indigènes que lorsqu'il n'y a pas d'autre option". Quand n'y a-t-il pas d'autre option ? Tout sur Android peut être réalisé via Java !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X