【问题标题】:Crossplatform iPhone / Android code sharing跨平台 iPhone/Android 代码共享
【发布时间】:2010-03-04 15:04:32
【问题描述】:

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

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

  1. 空白的新项目,提前知道有大量可重用逻辑需要在每个设备上运行。
  2. 现有的 iPhone 代码库,将 C、C++ 和 Objective-C 移植到 Android NDK 或其他方式。

当然,在一个完美的世界中,所有应用程序都将插入神奇的云中,所有可重用的逻辑都将在 Google App Engine 或某些网络服务中运行,但这不是这个问题的精神。在经历了 iPhone 到 Android 的移植,完全没有二手代码重用,看到这个人不得不忍受的痛苦之后,我想知道其他人是如何避免它的。

【问题讨论】:

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


【解决方案1】:

根据我的经验,您可以使用 Android NDK 编译 C 和 C++,因此如果您在 iPhone 中使用 iPhone Obj-C++ (.mm) 绑定用于 C++/C 引擎,而在 Android 中使用 Java 绑定到同一个引擎,应该是完全可以的。

所以 C++/C 引擎(Android 和 iPhone 几乎相同的代码库)+ 瘦绑定层 = 可移植代码。

【讨论】:

  • Apportable SDK 基于 Android NDK 编译 C、C++ 和 Objective C 以及添加库以匹配大部分 IOS API。
  • 虽然 Apportable 已经停业,但您可以使用 GNUstep Android toolchain 作为在 Android 上编译 Objective C 代码的替代方法(另请参阅下面我的单独答案)。
【解决方案2】:

就像我刚才告诉有人问过 similar question 一样,使用 MVC 并在 C++ 中实现 MC,在 obj-c 或 Java 中实现 V。

【讨论】:

  • 这不是一个好主意,因为如果没有针对 M+C 的 Objective-C 和 Cocoa 绑定,您最终会得到一些非常不雅和原始的东西。
  • 如果您正在考虑框架提供的 MVC 绑定或自动生成的代码。这些不用用,自己写接口层就可以了。另外,你认为不雅和原始的标准是什么?
  • 对此也很好奇。
【解决方案3】:

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

【讨论】:

  • 将尽可能多的逻辑放在普通的旧 C 中确实不会出错。
【解决方案4】:

你可以试试Marmalade SDK... 编译一次到原生 ARM 并使用相同的二进制、标准 C/C++ 部署到 Android 和 iPhone、在 windows 或 mac 上开发、大量(可选)中间件技术包括在内。

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

    • +1 提出了 LUA 的话题——我认为人们忘记了这一点
    【解决方案6】:

    XMLVM 看起来值得一试。

    【讨论】:

      【解决方案7】:

      我将BatteryTech 用于我的平台抽象内容,我的项目结构如下所示:

      在我的电脑上:

      游戏名 - 只包含通用代码

      gamename-android - 主要包含 BatteryTech 的 android 特定代码和 Android 配置,构建者指向 gamename 项目以获得通用代码

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

      在我的 Mac 上:

      游戏名 - 只包含通用代码

      gamename-ios - iPhone/iPad 构建,导入通用代码

      gamename-osx - OSX 原生构建。导入通用代码。

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

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

      【讨论】:

      • +1 Xcode 无法自动添加新文件。我猜它不知道要将它们添加到哪个项目,因为它的目录/文件夹/组项目结构松散。
      【解决方案8】:

      Moai 可免费用于小型项目,也可用于大型工作室。我自己运行自制软件,但如果我不这样做,我可能会自己使用 Moai,因为它看起来很有前途。他们声称它可以移植到 Mac、PC、iOS、Android,我认为甚至是 Kindle Fire。

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

      【讨论】:

      • @slf:你自己用过吗,如果用过,你怎么看?
      • 我没有,第一次听说,不过看起来很有潜力
      【解决方案9】:

      您可以使用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】:

        您也可以查看Titanium。用他们的工具说,你可以用抽象的网络代码编写你的应用程序,他们将帮助你与所有这些 gps、加速度计传感器等的网络应用程序接口。

        【讨论】:

          【解决方案11】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-04-11
            • 1970-01-01
            • 2011-02-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多