Как поделиться кодом между Android и iOS - PullRequest
44 голосов
/ 08 сентября 2010

Я ухожу от строгой разработки Android и хочу создавать приложения для iPhone. Насколько я понимаю, я могу программировать бэкэнд приложений iOS на C / C ++, а также использовать NDK для включения кода C / C ++ в приложения Android. Мой вопрос, однако, как? Я немного погуглил и не могу найти четких и кратких ответов. При рассмотрении примера кода для NDK кажется, что все имена функций и т. Д. Относятся к Android (или, по крайней мере, к Java), и поэтому я не смогу использовать этот бэкэнд C / C ++ для разработки внешнего интерфейса iPhone? Буду признателен за некоторые разъяснения по этому вопросу, и если вообще есть какой-нибудь код, чтобы помочь мне? (даже простой Hello World, который читает строку из файла C / C ++ и отображает ее в приложении для iOS и Android).

Спасибо, ребята Chris

Ответы [ 6 ]

68 голосов
/ 08 марта 2011

Обратите внимание, что я почти исключительно работаю над приложениями "бизнес / утилита / производительность"; вещи, которые в значительной степени зависят от довольно стандартных элементов пользовательского интерфейса и ожидают хорошей интеграции с их платформой. Этот ответ отражает это. См. Комментарий Митча Линдгрена к ответу Shaggy Frog для хороших комментариев для разработчиков игр, у которых совершенно другая ситуация.

Я считаю, что @ Shaggy Frog здесь не так. Если у вас есть эффективный, проверенный код на C ++, нет причин не делить его между Android и iPhone, и я работал над проектами, которые делают именно это, и он может быть очень успешным. Однако следует избегать опасностей.

Наиболее важно быть осторожным с «наименьшим общим знаменателем». Автономный, алгоритмический код, разделяет очень хорошо. Сложные платформы, которые управляют потоками, общаются в сети или иным образом взаимодействуют с ОС, сложнее сделать так, чтобы вам не пришлось ломать парадигмы платформы и использовать ЖК-дисплей, который одинаково плохо работает на всех платформах. , В частности, я рекомендую писать свой сетевой код, используя платформы платформы. Это часто требует подхода «сэндвича», когда верхний уровень зависит от платформы, а самый нижний уровень зависит от платформы, а средний - переносной. Это очень хорошая вещь, если тщательно продумано.

Управление потоками и таймеры также должны выполняться с использованием платформ платформы. В частности, Java интенсивно использует потоки, в то время как iOS обычно полагается на свой цикл запуска, чтобы избежать потоков. Когда iOS использует потоки, GCD настоятельно рекомендуется. Опять же, решение здесь состоит в том, чтобы изолировать действительно переносимые алгоритмы и позволить специфичному для платформы коду управлять тем, как он вызывается.

Если у вас есть сложная, существующая структура, которая имеет многопотоковую структуру и имеет много сетевого или пользовательского кода, разбросанного по ней, то совместное использование может быть затруднено, но я все равно рекомендую искать способы ее реорганизации, а не переписать его.

Как разработчик для iOS и Mac, который интенсивно работает с кроссплатформенным кодом, совместно используемым в Linux, Windows и Android, я могу сказать, что Android, безусловно, самая раздражающая из платформ, с которыми можно делиться (Windows использовала для сохранения этого различия, но андроид сдуло). В Android в большинстве случаев было неразумно делиться кодом. Но по-прежнему существует много возможностей для повторного использования кода, и их следует использовать.

4 голосов
/ 08 сентября 2010

Несмотря на то, что настроение здраво (вы следуете политике «Не повторяйте себя»), прагматично, если вы сможете эффективно поделиться этим кодом. В этом случае на самом деле невозможно использовать подход «один раз» для межплатформенной разработки, когда код для двух платформ должен быть написан на разных языках (C / C ++ / Obj-C для iPhone, Java для Android).

В этом случае вам лучше написать две разные кодовые базы (на двух разных языках). Совет: не пишите свой Java-код, как это C ++, или ваш C ++-код, как это Java. Несколько лет назад я работал в компании, у которой был продукт, который они «портировали» с Java на C ++, и они не писали код C ++, как это было на C ++, и это вызывало всевозможные проблемы, не говоря уже о том, что это сложно читать.

2 голосов
/ 28 марта 2013

Помимо использования C / C ++ доля , поэтому lib.

Если вы разрабатываете кросс-платформенные приложения, такие как игра, предложите использовать моно-фреймворк, такой как Unity3D .

В противном случае, если для разработки бизнес-приложений, требующих собственного пользовательского интерфейса и желающих совместно использовать код бизнес-логики на мобильных платформах, я предлагаю использовать встроенный движок Lua в качестве центра бизнес-логики клиента.

Пользовательский интерфейс клиента по-прежнему является собственным и имеет лучшую производительность пользовательского интерфейса .то есть Java на Android и ObjectC на iOS и т. д. Логика используется совместно с одинаковыми сценариями Lua для всех платформ .Таким образом, уровень Lua аналогичен клиентским службам (сравните со службами на стороне сервера).

- Андерсон Мао, 2013-03-28

2 голосов
/ 25 марта 2011

Я отправил этот же ответ на похожий вопрос, но я думаю, что это актуально, так что ...

Я использую BatteryTech для своей абстракции платформы, и структура моего проекта выглядит следующим образом:

На моем ПК :

  • gamename - содержит только общий код

  • gamename-android - содержит в основном код для BatteryTech для Android и конфигурацию Android, сборщики указывают на проект gamename для общего кода

  • gamename-win32 - Просто для сборки в Windows, используется код из проекта gamename

на моем Mac :

  • gamename - содержит только общий код

  • gamename-ios - Сборка для iPhone / iPad, импорт общего кода

  • gamename-osx - Собственная сборка OSX. импортирует общий код.

И я использую SVN для обмена между моим ПК и Mac. Мои единственные реальные проблемы - когда я добавляю классы в общую кодовую базу в Windows, а затем обновляюсь на Mac, чтобы вытащить их из SVN. У XCode нет способа автоматически добавлять их в проект без сценариев, поэтому мне приходится каждый раз извлекать их вручную, что является болью, но это не конец света.

Все эти материалы поставляются с BatteryTech, поэтому их легко понять, как только вы их получите.

2 голосов
/ 08 марта 2011

Написание базы общего кода действительно практично в этой ситуации. Существуют некоторые накладные расходы на настройку и поддержание их организованности, но основные преимущества заключаются в следующем: 1) уменьшить объем кода за счет совместного использования общих функций. 2) обмен исправлениями ошибок с общей базой кода. В настоящее время я знаю о двух маршрутах, которые я рассматриваю для проекта - используйте нативный c / c ++ (увеличение скорости за счет потери сборки мусора и установки целей на процессор) или используйте monodroid / monotouch которые предоставляют привязки c # для функциональности платформы каждой операционной системы (я не уверен, насколько она зрелая).

Если бы я писал игру с использованием 3d, я бы определенно использовал подход № 1.

1 голос
/ 11 марта 2011

Хотя я сам не использую их, поскольку большинство написанного мной не очень хорошо переносится, я бы порекомендовал использовать что-то вроде Appcelerator или Red Foundry для создания базовых приложений.затем его можно создать на любой платформе.В этих случаях вы пишете не target-c или java, вы используете какого-то посредника.Обратите внимание, что если вы выйдете за рамки, к которым вас приковали, вам нужно будет написать свой собственный код ближе к металлу.

...