跨平台iPhone / Android代码共享

时间:2010-03-04 15:04:33

标签: java c++ iphone objective-c android

简单地说:在iPhone和Android版本之间共享/重用代码的最有效方法是什么?

我认为最常见的两种情况是:

  1. 空白平板新项目,提前知道需要在每台设备上运行大量可重复使用的逻辑。
  2. 现有的iPhone代码库,将C,C ++和Objective-C移植到Android NDK或其他。
  3. 当然,在一个完美的世界中,所有应用程序都会插入神奇的云端,所有可重复使用的逻辑都会出现在Google App Engine或某些Web服务中,但这不是这个问题的精神。在经历了iPhone到Android的端口之后,没有任何代码重用,并且看到了这个人不得不忍受的痛苦,我想知道其他人是如何避免它的。

11 个答案:

答案 0 :(得分:21)

根据我的经验,你可以使用Android NDK来编译C和C ++,所以如果你在iPhone和Android中使用iPhone Obj-C ++(。mm)绑定到C ++ / C引擎,你可以使用Java绑定到相同的引擎,应该是完全可能的。

所以C ++ / C引擎(Android和iPhone几乎相同的代码库)+ Thin bindings layer =可移植代码。

答案 1 :(得分:8)

就像我告诉过一段时间问similar question的人一样,使用MVC并用C ++实现MC,用obj-c或Java实现V.

答案 2 :(得分:5)

尽可能在普通的旧C(或C ++,如果需要)中编写,并在Android和iPhone中包含相同的文件。适用于Windows / Mac。 “跨平台”的图书馆往往会消耗你。

答案 3 :(得分:3)

你可以使用Marmalade SDK ...一次编译到本机ARM并使用相同的二进制文件,标准C / C ++部署到Android和iPhone,在Windows或Mac上开发,很多(可选)包括中间件技术。

答案 4 :(得分:2)

我一直致力于使用Lua和我自己的框架为iPhone创建应用程序和游戏。这样我最终可以使用Android NDK为Android实现相同的框架,但实际的应用程序代码在两个平台上都可能完全相同。

我认为没有一种简单的方法可以做到这一点,因为API显然是不同的,本机编程语言是不同的,但是建立自己的框架可以用两种平台支持的任何语言,这将是我的建议。也许已经有一个框架可以为你做一些艰难的事情?如果没有任何好的框架可以做到这一点,那么这显然是一个自己实现它的机会。

答案 5 :(得分:2)

XMLVM看起来值得一试。

答案 6 :(得分:1)

我使用BatteryTech作为我的平台抽象的东西,我的项目结构如下所示:

在我的电脑上:

gamename - 仅包含公共代码

gamename-android - 主要包含BatteryTech的Android特定代码和Android配置,构建者指向游戏名称项目的公共代码

gamename-win32 - 仅用于构建Windows,使用来自gamename项目的代码

在我的Mac上:

gamename - 仅包含公共代码

gamename-ios - iPhone / iPad版本,导入常用代码

gamename-osx - OSX本机版本。导入公共代码。

我使用SVN在我的PC和Mac之间共享。我唯一真正的问题是当我在Windows中的公共代码库中添加类,然后在mac上更新以从SVN中删除它们。 XCode没有办法在没有脚本的情况下自动将它们添加到项目中,所以我每次都必须手动将它们拉出来,这很痛苦,但不是世界末日。

所有这些东西都附有BatteryTech,所以一旦你得到它就很容易搞清楚。

答案 7 :(得分:1)

Moai对于较小的项目是免费的,并且也被大型工作室使用。我自己运行自制软件,但如果我不自己运行,我可能会自己使用Moai,因为它看起来非常有前景。他们声称它是Mac,PC,iOS,Android的端口,我甚至认为是Kindle Fire。

我想在Lua中编写大部分代码,但您可以访问所有代码,因此您可以在需要时使用C ++。

答案 8 :(得分:0)

您还可以查看Titanium。使用他们的工具说你可以用抽象的网页代码编写你的应用程序,他们将帮助你的web应用程序界面与所有那些GPS,加速计传感器等。

答案 9 :(得分:0)

您可以使用Scapix Language Bridge自动将C ++桥接到Java和ObjC / Swift(以及其他语言)。直接从C ++头文件快速动态生成的桥代码。这是example

在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);
};

然后从Swift调用它:

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});
    }
}

答案 10 :(得分:0)

如果在Objective C中已有iOS代码库,则可以使用GNUstep Android toolchain在Android应用中使用基于Foundation和CoreFoundation的现有模型代码,然后编写一个新的与通过本地NDK调用(例如在Android Studio中)的Objective C模型。