【问题标题】:Objective-C and Android [closed]Objective-C 和 Android [关闭]
【发布时间】:2011-01-24 13:16:51
【问题描述】:

我刚刚为 Android 完成了一个相对较大的项目,但我知道它永远不会在太阳系这一侧最普遍的手机之一上运行(由那个果味十足的小俱乐部)。

因此,对于我的下一个项目,我希望以一种能够使大多数组件在 iPhone 和 Android 平台之间轻松传输的方式来编写它。我正在考虑这样做的方式是在 Objective-C 中编码大部分内容,然后分别在更多 Objective-C 和 Java 中添加特定于平台的部分。在 Android 端,这将需要使用 NDK。

我的C知识不错,但是Objective-C的知识接近于零,没有学习C++的欲望。上面的方法有多健全,还有更好的方法吗?有什么方法可以让我用 Java 编写代码并且仍然可以进入未破解的 iPhone 市场?我认识的人(iPhone 用户)在明年之前拥有 Android 手机的可能性有多大?

【问题讨论】:

  • @Tom R:一些为手机开发应用程序的专业游戏公司使用自动移植工具,将 Java 转换为 Obj-C(以及 Qualcomm BREW)。例如,游戏 Uniwar 在 iPhone AppStore 上排名前十,并在 iPhone 上排名第二(或第一?)2009 年最佳策略游戏,它完全用 Java 编写并自动翻译到 Obj-C。过去,这项技术的价格约为每位开发人员每季度 2500 美元,而且效果很好:)
  • 还有三星和 Yeecco 发布的这个新工具:yeecco.com/ecosys/samsung >建立在谷歌 Android 的原生开发工具包 (NDK) 之上,Stella SDK 是用纯 Objective-C 语言编写的,以绕过临时 Java层。运行时不需要解释字节码,但机器码直接在 CPU 上执行。 Stella SDK 采用多线程架构,可压缩所有系统资源,确保在 Android 设备上获得最佳性能。
  • 发布了一个新的 StellaSDK 可以做到这一点:stackoverflow.com/a/16677772/308315
  • 当今最好的方式:颤动或反应原生

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


【解决方案1】:

退后一步,想想你最终能在逻辑上分享什么。

UI 模型完全不同,组件也不同。最后,您可能能够分享的是数据对象类,可能是一些算法。甚至不像过去那样实际上最终会共享网络代码,因为您不是直接使用套接字,而是使用 HTTP 库。

那么,您为此付出的所有努力最终真的会得到回报吗?在我看来,最终结果将是一个难以更新的脆弱混乱,并且在两个平台上都是平庸的,而不是在任何一个平台上都很好。

您为什么要编写应用程序?让您或您的用户的生活更轻松?

【讨论】:

  • 问也不过分……但宇宙不会经常回答这样的要求!
  • 这可能会让您大吃一惊,但即使在今天,尽管有些人尽了最大的努力,但并不是所有的世界都适合 HTTP 请求。
  • @asveikau 这是一份打印出来贴在墙上的声明!
  • 我完全不同意这个评论。有大量的行为代码可以跨平台共享。使用诸如 TDD 之类的方法会迫使您将平台代码与业务逻辑分开。此外,对于在手机上同样适用的一致应用程序也有一个广阔的开放市场。
  • 根据我的经验,行为代码是如此微不足道,以至于不值得将整个项目限制在共享几页伪代码上。您可以在不共享代码的情况下保持应用程序的一致性,如果您愿意进行大量自动化测试以确保一致性,更是如此。将代码分开的原因是一个问题:您希望您的应用程序在其运行的任何平台上都保持一致或出色吗?你不能两者兼得。在所有平台上运行相同的应用程序总是有可以改进的地方。
【解决方案2】:

其他人基本上都这么说,但我想更明确一点。你最好的选择可能是写:

  1. 跨平台数据模型和核心逻辑,使用:
    • GNUstep (Obj-C),或
    • CF-Lite (C),或
    • 任何你想要的,只要它是跨平台的:P
  2. 仅适用于 iPhone 的界面代码,使用 Cocoa Touch (Obj-C)
  3. 仅限 Android 的界面代码,但它们是为 Android 做的。

这是尽可能接近的;任何编写跨平台界面代码的尝试无疑会导致在两个平台上的应用程序平庸。但是,所有其余的代码都是可移植的,并且只是围绕它包装一个特定于设备的接口,这一直在完成,并且对于一些 iPhone 开发人员来说效果很好。 p>

【讨论】:

  • 迄今为止的最佳答案。这对于诸如简单游戏之类的事情非常有帮助,其中大量代码是游戏逻辑,而较少量的代码用于渲染和 UI。
  • 我不同意 CF-Lite 是一个很好的跨平台解决方案。基本上它对 Mac 程序员很方便,对其他人没有。我更愿意建议像 GLIB 之类的东西——尽管这有点偏向 gtk+ 程序员。
  • 您不太可能找到既方便使用 iPhone 代码又使用 Android 代码的东西;我想为什么不选择像 CF-Lite 这样与 NS 类有免费桥接的东西呢?这样,您的界面中至少有一个易于编写。 :)
  • 您现在可以使用GNUstep Android toolchain 如上所述设置项目,并在Android 应用中使用基于Foundation 和CoreFoundation 的Objective C 模型代码。
【解决方案3】:

没有 Cocoa 的 Objective-C 不是很有用,并且不会让你更接近拥有一个工作的 iPhone 代码库。您最好使用 Core Foundation 用 C 语言编写核心,并使用 Java 或 Objective-C 作为平台特定部分。 Apple 已将大部分 Core Foundation 开源为 CF-Lite,它与 OS X 上的 Cocoa 免费桥接(即,您可以将许多 CF 类与它们的 Cocoa 对应物互换使用)。

【讨论】:

  • 感谢您的回答。我特别提到 Obj-C 作为我想要编写核心代码的语言(而不是 C/C++)的原因是它被推荐给我,因为它是一种非常好的基于 C 的 OOP 语言。没有 Cocoa 的 Obj-C 有多不可用?
  • Objective-C 在我看来是一种没有 Cocoa 的完全合理的语言。几乎没有人在没有 Cocoa 的情况下使用它,因为在所有非 Mac 平台上都有更流行的语言,但我认为没有理由不使用它。它是 gcc 的一部分,因此几乎可以在任何 Unix 或 Linux 平台上使用。
  • 他并没有说没有 Cocoa 的 Objective-C 是不合理,只是没有那么有用。想象一下没有任何 java.* 和 javax.* 类的 Java,没有标准库的 C,没有 .NET 的 C#,等等。一种语言可能很棒,但相应的代码库才是真正为大多数人增加价值的东西。 Cocoa 极大地减少了开发人员必须做的工作,以至于没有它,Objective-C 就沦为一门非常有趣的语言。就其本身而言,“有趣”并不能支付账单。更具体地说,没有 Cocoa 的 iPhone 应用程序将是初级的,难以编写和维护。
  • Obj-C 是一门很好的核心语言。如果我在没有 Cocoa/GNUstep 的情况下使用它,我想我最想念的是来自NSObjectretainrelease,以及NS{Mutable,}{Array,Dictionary} 和所有支持类。但是,如果您想自己重写这些以及其他任何内容,我想您将拥有良好的基础。
  • 是的,这有点关键。如果您没有所有这些东西,则必须自己从头开始编写它们。我同意核心语言很好。但是,如果没有我每天使用的部件,它对我来说只是另一种编程语言。有许多没有人使用的可靠语言。就像 Objective-C 所基于的 Smalltalk。我想到了很多其他人,但也许那是因为我花了相当多的时间在学术界学习 CS。 :-)
【解决方案4】:

我没有经验支持它的猜测是,你可能可以用 Google 的 NDK 编写 Obj-C,因为 ARM 存在 GCC,是开源的,有一个 Obj -C 编译器和一个基本的 Obj-C 运行时(如果它还没有可能被破解以在新架构上工作)等。

这也可能需要大量工作才能带来可疑的好处。

当然,“Obj-C”(没有 NS 类)的含义与“Cocoa”非常不同,这是大多数人真正说“Obj-C”时的意思.您也许可以为此重用一些 GNUstep,但是……老实说,我对此表示怀疑。听起来又是一项繁重的工作。

所以,是的,我认为这是可能的。这也是很多工作,我认为不值得。

鉴于您所说的,如果我尝试这样做,我会很想用 C 编写尽可能多的核心逻辑,然后为每个平台使用两个单独的 GUI 包装它。

【讨论】:

  • 这正在成为我的新口头禅...... C 中的模型(以及任何服务/库/共享代码),最合适的平台语言/库中的视图/控制器。
  • 你说得对,gcc 和 llvm 在 Android 上也支持 Objective-C。除了编译器之外,您还需要 Objective-C 运行时,它以 libobjc2 的形式开源并在 Android 上运行。有了这个,并使用 GNUstep 作为 Objective-C 框架(即 Foundation)的实现,您绝对可以在 Android 上使用 Objective-C 代码。 GNUstep Android Toolchain 提供了完整的设置。
【解决方案5】:

从不同的角度来看...我知道您说过您想尝试并坚持使用 Java,但是如果您了解 C#,那么您可以使用适用于 iPhone 的 MonoTouch 框架。 Mono 本质上是 .Net 堆栈的开源实现。 Mono 团队正在努力将 Mono 引入 Android,因此您基本上可以为您的业务逻辑编写一个共享的 C# 库,并且每个平台都有不同的视图/控制器。当然,这一切都在 C# 中,而且成本更高一些,但它确实解决了用不同语言编写所有内容的问题。

我相信它在 iPhone 上称为 MonoTouch,在 Android 上称为 MonoDroid。

【讨论】:

  • 继续这样做,并让您的商店从 AppStore 中屏蔽。苹果不希望你这样。原来的提问者显然也已经知道了,这就是为什么他想到了“好吧,所以我们将在任何地方使用Objective C”的想法,这也是行不通的。 Apple 的限制要求您的应用程序“最初”以 C、C++ 和 Objective C 的某种组合编写。由于允许使用 C 库,我不明白为什么最初的提问者会关心在 iPhone 以外的任何地方使用 ObjectiveC。因此,这个问题有点不寻常。
  • @Warren P:我知道这是一个旧评论,但对于未来的读者,我想指出这不再是这样了。 Unity 和 Mono 在 Apple 上都没有遇到过问题。 Apple 的限制针对的是 Adob​​e Flash,仅此而已。规则也被取消了。
  • 没错。从那以后,苹果放松了很多。他们不仅放宽了单声道(运行时)和语言(Objective-C 除外)问题,还允许模拟器(如 C=64)重新加入,等等。我的评论在写的时候是正确的,如果苹果的风向再次转变,将来可能会再次正确。
【解决方案6】:

Apportable SDK 是一种 Objective-C 方法,只需编写一次即可部署到 IOS 和 Android。它将一个正在运行的 IOS Xcode 项目交叉编译为一个 Android SDK。

请参阅here 了解下载后几分钟内可在两个平台上运行的示例应用程序。

【讨论】:

【解决方案7】:

我不确定Android,但在iPhone 上你基本上可以直接编写C,只要你将它封装在Objective-C 类中。

【讨论】:

    【解决方案8】:

    Objective-C 运行时尚未移植到 Android。这不应该是太多的工作,但是,如果没有该语言的工作知识,我怀疑你会很容易移植它。

    您尝试做的事情对于通用应用程序来说会很困难,但如果您选择使用纯 C 语言(Android NDK 和 iPhone 都支持)开发游戏,那么对于游戏来说应该是可行的。您必须编写一些胶水代码才能将来自 Obj-C 和 Java 环境的输入事件传递到您的 C 代码中,但这应该不是什么大问题 - Objective-C 允许您直接调用您的 C 代码并且有很多示例项目可以为 Android 做到这一点。

    【讨论】:

      【解决方案9】:

      我自己还没有尝试过,也没有看完演讲,但是 YouTube 上的 Developing iPhone Applications using Java 上有一个 Google 技术演讲,看起来很有希望。

      【讨论】:

        【解决方案10】:

        XMLVM 是一个能够将(某些)Android 应用程序转换为 iPhone 的项目。欲了解更多信息,请访问http://xmlvm.org/android/

        【讨论】:

          【解决方案11】:

          我意识到这可能有点晚了,但似乎这个行业现在正朝着网络应用的方向发展,以实现应用的可移植性。也就是说,在您的“骨架原生应用程序”中嵌入网络浏览器,并为 Android、iOS 和其他主要智能手机平台编写 javascript、css 和 html。

          有一些工具可以帮助您解决这个问题。您可能想查看PhoneGapSencha Touch,但还有更多。请注意,这种方法可能不适合实时/动画密集型应用程序。

          【讨论】:

            【解决方案12】:

            这是来自 facebook 的 mobile@scale 会议的演讲,其中两个团队(dropbox 和管弦乐队)使用了类似的方法。 Dropbox 使用 C++ 创建 libdropbox,Orchestra(邮箱)使用 Objective-c 创建 libmailbox。

            同样,他们使用平台原生语言编写前端,并将跨平台库用于核心逻辑和数据。

            我拿走的主要好处:邮箱在 5 周内从 ios 转到 android,因为它只是构建 UI 代码。 Dropbox 可以通过 Android 测试版部署对共享库中的核心功能的更改进行测试版测试,这样更容易为测试版构建大规模部署。

            【讨论】:

              【解决方案13】:

              如果您可以等到今年晚些时候(具体时间未知),Adobe 将拥有适用于 Android 的 AIR 和适用于 iPhone 的编译器。因此,您可以在 AIR for Android 中编写应用程序,并使用大部分相同的代码编译到 iPhone。

              http://labs.adobe.com/technologies/flashcs5/appsfor_iphone/

              即使您迫不及待,请参阅:http://www.insideria.com/2008/12/actionscript-to-cocoa---protot.html,它解释了 ActionScript 和 Cocoa 之间的相似之处。

              另请查看:http://labs.adobe.com/technologies/air2/ 了解能够使用触摸屏的 AIR 版本。

              因此您可以很快编写一次并使用 ActionScript 3 部署到 Android 和 iPhone。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2023-04-10
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-06-24
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多