web-dev-qa-db-fra.com

Comment coder le partage entre Android et iOS

Je m'éloigne du strict Android Développement et désirant créer des applications iPhone. Ma compréhension est que je peux coder le backend d'applications iOS en C/C++ et que je peux également utiliser NDK pour Inclure C/C++ code In Android Applications. Ma question est cependant comment? J'ai googlé un peu et je ne trouve aucune réponse claire et concise. Lorsque vous envisagez de réponses. NDK, il semble que toutes les noms de fonction, etc. sont Android (ou au moins Java) spécifique et donc je ne pourrais donc pas utiliser ce backend C/C++ pour développer un iPhone Fatrontend? Je "D apprécier certaines éclaircissements sur cette question et si du tout disposait du code pour m'aider à sortir? (Même un simple monde de bonjour qui lit une chaîne à partir d'un fichier C/C++ et l'affiche dans un iOS et Android application).

Merci guys chris

44
Sonoman

Bien que le sentiment soit sain (vous suivez la stratégie de ne pas vous répéter), ce n'est que pragmatique si ce que vous pouvez partager ce code de manière efficace. Dans ce cas, il n'est pas vraiment possible d'avoir une approche "Écrire une fois" du développement multiplateformes où le code de deux plates-formes doit être écrit dans différentes langues (C/C++/Obj-C sur iPhone, Java pour Android).

Vous ferez mieux d'écrire deux code de code différentes dans ce cas (dans deux langues différentes). Bord de conseil: N'écrivez pas votre Java Code comme c'est C++ ou votre code C++ comme c'est Java. J'ai travaillé lors d'une entreprise il y a plusieurs années qui avait un produit "porté" De Java à C++, et ils n'ont pas écrit le code C++ comme celui-ci était C++, et cela a causé toutes sortes de problèmes, sans parler d'être difficile à lire.

4
Shaggy Frog

Notez que je travaille presque exclusivement sur des applications "affaires/utilité/utilité/productivité"; des choses qui s'appuient fortement sur des éléments d'interface utilisateur assez standard et s'attendent à bien s'intégrer à leur plate-forme. Cette réponse reflète cela. Voir Mitch Lindgren's Commenter à Shaggy Frog's Réponse pour de bons commentaires pour les développeurs de jeux, qui ont une situation complètement différente.

Je crois que @shaggy grenouille est incorrecte ici. Si vous avez efficacement le code testé en C++, il n'y a aucune raison de ne pas la partager entre Android et iPhone, et j'ai travaillé sur des projets qui font exactement cela et cela peut être très réussi. Il y a cependant des dangers qui devraient être évités.

Plus de manière critique, faites attention au "dénominateur commun le plus bas". Code algorithmique autonome, algorithmique, des actions très bien. Des cadres complexes qui gèrent des threads, parlent sur le réseau ou qui interagissent autrement avec le système d'exploitation sont plus difficiles à faire d'une manière qui ne vous oblige pas à casser les paradigmes de la plate-forme et de tirer pour le LCD que Fonctionne également mal sur toutes les plateformes. En particulier, je recommande d'écrire votre code de réseautage à l'aide des cadres de la plate-forme. Cela nécessite souvent une approche "sandwich" où la couche supérieure est spécifique à la plate-forme et que la couche très inférieure est spécifique à la plate-forme, et le milieu est portable. C'est une très bonne chose si conçue soigneusement.

La gestion du fil et les minuteries doivent également être effectuées à l'aide des cadres de la plate-forme. En particulier, Java utilise fortement les threads, tandis que IOS repose généralement sur son runloop pour éviter les threads. Lorsque IOS utilise des threads, GCD est fortement préféré. Encore une fois, la solution ici consiste ici à isoler les algorithmes véritablement portables et à laisser le code spécifique à la plate-forme gérer comment il est appelé.

Si vous avez un cadre complexe et actuel qui est fortement enfermé et que de nombreux codes de réseau ou d'assurance-chômage se propagent tout au long de cela, le partage peut être difficile, mais ma recommandation serait toujours de rechercher des moyens de le refroidir plutôt que de la réécrire.

En tant que développeur iOS et Mac qui travaille de manière approfondie avec le code multi-plate-forme partagé sur Linux, Windows et Android, je peux dire que Android est de loin la plus gênante des plateformes à partager avec (Windows utilisée pour tenir Cette distinction, mais Android a soufflé le coup). Android a eu le plus de cas où il n'est pas sage de partager le code. Mais il reste encore beaucoup d'opportunités pour la réutilisation du code et ils devraient être poursuivis.

69
Rob Napier

J'ai posté cette même réponse à une question similaire mais je pense que c'est pertinent alors ...

J'utilise BatteryTech pour mes trucs de plate-forme-abstraction et ma structure de projet ressemble à ceci:

sur mon PC :

  • gamename - contient juste le code commun

  • gamename-Android - contient principalement le code android de la batterie et Android config, les constructeurs pointent du projet Gamename pour le code commun

  • gamename-win32 - Juste pour la construction de Windows, utilise le code du projet Gamename

sur mon Mac :

  • gamename - contient juste le code commun

  • gamename-ios - La construction iPhone/iPad, importe le code commun

  • gamename-osx - La construction natif OSX. importations de code commun.

Et j'utilise SVN pour partager entre mon PC et Mac. Mes seuls problèmes réels sont lorsque j'ajoute des cours au code de code commun dans Windows, puis mettez à jour sur le Mac pour les retirer de SVN. Xcode n'a pas de moyen de les ajouter automatiquement au projet sans scripts, je dois donc les tirer manuellement chaque fois, ce qui est une douleur mais n'est pas la fin du monde.

Tous ces trucs sont livrés avec la batterie de la batterie, il est donc facile de comprendre une fois que vous l'obtenez.

2
rbgrn

En plus d'utiliser C/C++ Share SO Lib.

Si vous pour développer des applications multiples plate-forme telles que Jeu, suggérez-la d'utiliser un cadre mono basé sur une nity3d.

Sinon, si pour développer des applications commerciales nécessitant une interface utilisateur natale et que vous souhaitez partager des plateformes mobiles Cross Mobile Cross Mobile, je suggère d'utiliser LUA Moteur intégré en tant que Centre logique des entreprises client.

L'interface utilisateur client est toujours natif et obtenez Meilleures performances de l'UI . IE Java ON Android et objetc sur iOS, etc. La logique est partagée avec mêmes scripts Lua pour toutes les plateformes . La couche Lua est donc similaire à celle des services clients (comparer aux services latéraux du serveur).

- Anderson Mao, 2013-03-28

2
Anderson Mao

Écrire une base de code partagée est vraiment pratique dans cette situation. Il y a des frais généraux à la mise en place et à la garder organisés, mais les principaux avantages sont ces 1) réduisent la quantité de code en partageant la fonctionnalité commune 2) partageant des corrections de bugs à la base de code commun. Je suis actuellement au courant de deux itinéraires que je considère pour un projet - utilisez le Native C/C++ (gains à la vitesse au détriment de la perte de la collecte des ordures et de fixer des cibles par processeur) ou d'utilisation monodroid/monoTouch qui fournissent des liaisons C # pour la fonctionnalité de la plate-forme de chaque système d'exploitation (je suis incertain de la maturité.)

Si j'écris un jeu en utilisant 3D, j'utilise certainement l'approche n ° 1.

2
jchristof

Bien que je ne les utilise pas moi-même comme la plupart des trucs que j'écris ne manqueront pas bien, je recommanderais d'utiliser quelque chose comme Appelerator ou Fonderie rouge pour construire des applications de base que peut ensuite être créé de manière native sur l'une ou l'autre plate-forme. Dans ces cas, vous n'édentifoiez pas Objective-C ou Java, vous utilisez une sorte d'intermédiaire. Notez que si vous déménageez à l'extérieur de la boîte, vous devez vous confiner, vous devrez écrire votre propre code plus proche du métal.

1
Scott