Кроссплатформенный обмен кодами iPhone/Android

Проще говоря: Каков наиболее эффективный способ совместного использования/повторного использования кода между iPhone и Android?

Два наиболее распространенных сценария, которые я думаю:

  • Новый проект Blank slate, зная заранее, существует большая часть многоразовой логики, которая должна запускаться на каждом устройстве.
  • Существующая база кода iPhone, портирование C, С++ и Objective-C на Android NDK или иначе.

Да, конечно, в идеальном мире все приложения будут просто подключаться к волшебному облаку, и вся логика многократного использования будет в Google App Engine или некоторых веб-сервисах, но это не дух этого вопроса. После того, как я столкнулся с портами iPhone для Android без повторного использования кода во всех отношениях и увидев боль, которую должен был переносить человек, я хотел бы знать, как другие люди избегают этого.

Ответ 1

По моему опыту вы можете использовать Android NDK для компиляции C и С++, поэтому, если вы используете привязки iPhone Obj-С++ (.mm) для движка С++/C на iPhone, а в Android вы используете привязки Java к тот же двигатель, он должен быть полностью возможен.

Итак, С++/C engine (почти такая же кодовая база для Android и iPhone) + Тонкий слой привязок = Портативный код.

Ответ 2

Как я сказал кому-то, кто задал аналогичный вопрос некоторое время назад, используйте MVC и реализуйте MC в С++ и V в obj-c или Java.

Ответ 3

Пишите как можно больше в простой старый C (или С++, если необходимо) и просто включайте те же файлы в Android и iPhone. Работает и на Windows/Mac. "Кросс-платформенные" библиотеки, как правило, потребляют вас.

Ответ 4

Вы могли бы пойти с Marmalade SDK... Скомпилировать один раз для встроенного ARM и развернуть на Android и iPhone с тем же двоичным, стандартный C/С++, разрабатывается на окнах или маке, много (опционально) технологий промежуточного программного обеспечения.

Ответ 5

Я работаю над созданием приложений и игр для iPhone, используя Lua со своей собственной инфраструктурой. Таким образом, я мог бы в конечном итоге реализовать ту же платформу для Android с помощью Android NDK, но реальный код приложения, мы надеемся, будет абсолютно одинаковым для обеих платформ.

Я не думаю, что есть простой способ сделать это, потому что API-интерфейсы, очевидно, разные, а языки родного программирования разные, но создание моего собственного фреймворка на любом языке, поддерживаемом обеими платформами, будет моим предложением. Может быть, у вас уже есть структура, которая сделает для вас тяжелый труд? Если для этого нет каких-либо хороших рамок, то это, безусловно, возможность реализовать их самостоятельно.

Ответ 6

XMLVM стоит попробовать.

Ответ 7

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

На моем ПК:

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

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

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

На моем Mac:

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

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

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

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

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

Ответ 8

Moai является бесплатным для небольших проектов и используется также большими студиями. Я сам бегал домой, но если бы я этого не сделал, я бы, вероятно, использовал сам Моай, поскольку он выглядит очень многообещающим. Они утверждают, что это порты для Mac, ПК, iOS, Android, и я думаю, что даже Kindle Fire.

Вы хотите написать основную часть кода в Lua, я думаю, но у вас будет доступ ко всему коду, поэтому вы можете использовать С++, когда вам это нужно.

Ответ 9

Вы также можете посмотреть Titanium. Скажем со своим инструментом, вы можете написать свое приложение в абстрактном веб-коде, и они помогут вам в интерфейсе веб-приложений со всеми этими gps, датчиками акселерометра и т.д.

Ответ 10

Вы можете использовать Scapix Language Bridge для автоматического соединения C++ с Java и ObjC/Swift (среди других языков). Код моста автоматически генерируется на лету непосредственно из заголовочных файлов C++. Вот пример:

Определите свой класс в C++:

#include <scapix/bridge/object.h>

class contact : public scapix::bridge::object<contact>
{
public:
    std::string name();
    void send_message(const std::string& msg, std::shared_ptr<contact> from);
    void add_tags(const std::vector<std::string>& tags);
    void add_friends(std::vector<std::shared_ptr<contact>> friends);
};

И позвони из Свифта:

class ViewController: UIViewController {
    func send(friend: Contact) {
        let c = Contact()

        contact.sendMessage("Hello", friend)
        contact.addTags(["a","b","c"])
        contact.addFriends([friend])
    }
}

И с Java:

class View {
    private contact = new Contact;

    public void send(Contact friend) {
        contact.sendMessage("Hello", friend);
        contact.addTags({"a","b","c"});
        contact.addFriends({friend});
    }
}

Ответ 11

Если у вас есть база кода iOS в Objective C, вы можете использовать набор инструментов Android GNUstep, чтобы использовать существующий код модели на основе Foundation и CoreFoundation в приложении для Android, а затем написать новый слой пользовательского интерфейса, который взаимодействует с моделью Objective C через родной NDK вызывает поверх этого (например, в Android Studio).