Objective-C和Java,iPhone和Android之间有很大的区别吗?

13

编辑:我错了,我想说的是Objective-C,而不是C#。出于某种原因,我认为iPhone使用的是C#。所以对于C#的答案非常好,谢谢,但它们有点不相关,对此我感到很抱歉。

我已经查看过一些内容,但找不到任何答案来回答这个问题,尽管一些人已通过回答部分问题来缩短问题。在一个小组中,我们计划在iPhone和Android上进行一些工作,大部分是分开进行的,但互相帮助,并且有一些人将图形工作分配给他们。

但我们正在思考在两者之间移动事物的可能性,不一定是应用程序,也许只是有用的类或其他东西。查看Objective-C和Java,它们似乎具有相同的特征,最大的障碍可能是系统接口问题,因此我们想知道是否可以在每个系统上创建一个抽象,以便它们可以得到相同的输入(除非我错了,这不会对系统造成太大的负担?),在objective-c和Java之间编写转换代码时是否会遇到任何问题,比sdk中方法位置更糟糕?还是有关键功能或其他语言缺少的内容,这意味着唯一的方法是从头开始重新编写。


嗯...在下面的答案中已经提到了几次,但是只是想指出...iPhone是用Objective-C编程的,而不是C#。(C#是微软的技术,也许你可以用它来编写Windows Phone 7) - Ricket
Windows Phone 7目前只支持C#编程,同时您可以在Windows Phone 7中选择Silverlight和XNA作为用户界面支持。 - Cylon Cat
2
实际上,有 Mono 软件包和工具支持使用 C# 开发 iPhone、iPod Touch 和 iPad 应用程序。 - Thomas Owens
2
C# 将可用于 Android,请参见 http://go-mono.com/monodroid/,而 C# 已经可用于 iPhone、iPod 和 iPad,请参见 http://monotouch.net/。 - Alex Bitek
7个回答

52

我不会浪费时间试图寻找iOS和Android之间的共性。

跨平台开发几乎总是浪费时间和资源,除非跨平台功能对应用程序的运行至关重要。对于像iPhone和Android这样具有自定义操作系统并与硬件紧密配合的平台来说,这一点尤其真实。

长期来看,跨平台开发环境增加了复杂性,而不是减少了复杂性。虽然听起来很不错,但通常您可以轻松获得所需的90%的内容,然后您会遇到无法解决的问题,从而破坏了所有节约,并开始使您处于亏损状态。这里有太多妥协和将方形钉塞入圆孔的地方。

除非您的应用程序理论上可以从通用的网页运行,否则跨平台并不适合您。

在Objective-C和Java的特定情况下,尽管Java起源于Objective-C,但它们没有现代互操作性。您不能在一个平台上使用另一个平台的代码。

您应该花时间学习每个平台的特定API。没有捷径可走。


4
这是跨平台用户界面的明智建议,但并非适用于所有跨平台代码。 - jamesh
2
非常好的建议。并且继续前进非常整洁。但是那些已经希望进行跨平台开发的人可能不会接受它... - Kartihkraj Duraisamy

4

XMLVMCodename OneiSpectrum这样的工具告诉我们,实际上可以将Java代码(从Android应用程序或从头开始创建)交叉编译为Objective-C代码,在iPhone上运行而无需在苹果设备上安装任何虚拟机。

我建议观看使用Java开发iPhone应用程序

很遗憾,苹果的iPhone SDK许可协议禁止将Java虚拟机移植到iPhone上。在本演示中,我们介绍了一个开源的Java-to-Objective-C交叉编译器以及一个基于Java的Cocoa库实现。借助这些工具,可以使用纯Java编写iPhone应用程序。使用Cocoa的Java版本,可以将Java基础的iPhone应用程序作为Java桌面/小程序应用程序运行,并进行交叉编译以在iPhone上本地运行。本次演讲将讨论Java-to-Objective-C交叉编译器和基于Java的Cocoa版本的挑战。详情请参见http://www.xmlvm.org/

此外,关于将Android应用交叉编译到iPhone的更多见解,请参考2010年2月的一次讲座(此处)。该讲座记录在http://www.xmlvm.org/android/中:

Android是移动设备的开源平台。由Google发起,引起了广泛关注。Android应用程序使用Java开发,尽管一个特殊的编译器将类文件转换为专有的、基于寄存器的虚拟机,该虚拟机用于Android设备上执行应用程序。Android定义了自己的API来编写移动应用程序。通过XMLVM可以将基于Java的Android应用程序交叉编译为本地iPhone应用程序。

Android应用程序是用Java编写的,并利用了Android特定的API。XMLVM提供了一个兼容库,用Java编写,提供与Android相同的API,但只使用基于Java的Cocoa Touch API。在交叉编译过程中,应用程序和Android兼容库都从Java交叉编译到Objective-C,并链接到Cocoa Touch兼容库,以生成本地iPhone应用程序。

从2008年关于为iPhone构建Java应用程序的讲话中http://www.xmlvm.org/iphone/:

苹果的iPhone在用户和开发者中都引起了巨大的兴趣。与MacOS X一样,iPhone开发环境基于Objective-C作为开发语言和Cocoa作为GUI库。iPhone SDK许可协议不允许开发虚拟机。使用XMLVM,我们通过将Java交叉编译到iPhone来解决这个问题。就像Java应用程序可以交叉编译到AJAX一样,XMLVM可以用于将Java应用程序交叉编译到Objective-C。交叉编译也是通过在Objective-C中模仿基于堆栈的机器来完成的。

2
我为什么决定跳过iPhone开发,这就是原因...更不用说你必须有强壮的下颚和倾向于向苹果提供口交刺激才能获得应用程序的批准。 - androidworkz
获取应用程序的批准并不那么困难。 - ingh.am

3
如果你专注于抽象掉系统交互这样的东西,而坚持使用语言的共同子集,那么你可能可以构建出需要很少或没有修改就能从一种语言移植到另一种语言的类。
相较于Java,C#确实具有更好的泛型实现,因为C#的泛型在运行时保留了强类型。
C#还拥有LINQ,据我所知,Java尚无与之等效的(至少目前如此)。LINQ提供了一种类似SQL的查询功能,内置于语言中并得到.NET框架的完全支持,它让你可以查询对象集合,并以非常函数式的方式完成。一旦查询提供程序提供了将转换为其他格式的对象模型,LINQ就可以扩展为与其他数据格式(例如XML和SQL)一起使用。LINQ还使多核工作的并行化变得非常容易。它是语言功能的一个巨大扩展。

3
这个话题经常充斥着技术jihadis的教条主义,因此我会在我的答案中尽量避免这种情况。根据我的经验,我基本同意人们认为在两个平台之间共用代码是很困难的,但是有一些重要的例外:
当你的业务逻辑: - 是非平凡的; - 应该在不同平台上标准化; - 与外部世界有明确定义的交互(例如网络堆栈或UI)。 - (额外加分项)已经编写好了
在这种情况下,跨平台开发就会被考虑到。在这里,苹果扮演着速率决定步骤的角色,因为它对源代码语言采取了臭名昭著的3.3.1限制。你可以根据绑定的Webkit、C、C++和Objective C来编写Javascript代码。
如果你不想在“卓”的上面安装额外的语言,你可以使用编译成dalvik代码的Java,类似于略微不同的webkit构建中的Javascript,或者来自NDK的一些内容。然后你就会看到C/C++。你可以交叉编译Objective-C,但我没有任何经验。
将业务逻辑与UI和网络分离是很重要的,因为你将会寻找为网络层编写适配器,为UI编写其他内容。
我不会尝试使用C/C++编写跨平台的UI代码,而是会编写一些使用HTML/CSS/JS的东西,或者更可能编写一些完全定制的内容,以利用每个平台上不同的UI隐喻——例如,在iPhone上没有与通知栏相似的模拟。iPhone上的动画实现比在Android上简单几个数量级。
如果你不需要UI与操作系统高度集成,则webview和一些HTML5可能就足够了。Titanium在这里是一个不错的选择,我知道的同事告诉我它比PhoneGap更好(即编译而不是解释)。再次强调,我不知道。
另一方面,开放GLES在两个平台上都可用。
还应该注意,SVG在当前的一批Android操作系统中不可用。

1

如果你真的想进行跨手机开发,只要不是非常计算密集的东西,我可能会选择PhoneGap

PhoneGap是一个用于构建跨平台移动应用程序的开源开发框架。使用HTML和JavaScript构建应用程序,仍然可以利用iPhone/iTouch、iPad、Google Android、Palm、Symbian和Blackberry SDK的核心功能。

据我所知,这几乎是唯一允许在iPhone应用商店中使用的跨平台工具包。

如果您坚持进行本地开发,除非您制作游戏并针对 C,否则将需要大量工作来进行移植。框架非常不同,构建 UI 的方式也非常不同。话虽如此,回答你关于 Objective-C vs. Java 的直接问题,其实并不是那么糟糕。它们之间的差异足够大,以至于抽象工具不会那么容易——不像 Java vs. C#。例如,在 iPhone 上,Objective-C 没有垃圾回收,并且语法非常不同。Objective-C 在做方法调用(Objective-C 中的消息)时更加松散类型化。尽管如此,从编程范例的角度来看,它们并没有太大的不同。它们都是面向对象的命令式语言。它们都有类和方法、公有和私有。如果您想手动移植代码,这并不是世界末日,但我认为您可能会花费更多时间来构建一个抽象层。


1
类似于PhoneGap的是Titanium(http://www.appcelerator.com/),它允许您使用Web技术构建本机移动和桌面应用程序。我不知道Java是否可用于iPhone、iPad,但通过http://monotouch.net/项目,C#已经存在,并且有多个应用程序被接受,请参见http://monotouch.info/MonoTouch/Apps。 - Alex Bitek
刚刚发现一个有趣的项目,名为iSpectrum(除了已在答案部分中描述的XMLVM项目之外),它可以让你为iPhone构建Java应用程序,请参见http://www.flexycore.com/ispectrum-overview.html。 - Alex Bitek

0

你不能用同一种语言开发iPhone和Android应用。对于iPhone,你只能使用Objective C进行编程,这是由苹果公司开发的。你不能在Android上使用它,而且唯一的开发iPhone应用的方式就是使用这种语言(这在用户协议中有规定)。

至于C#和Java的区别,整个原则都不同。Java是为每个平台设计的一种语言,.Net是为每种语言设计的一个平台。它们不兼容。你可以在Android上使用Java,但我不确定是否也可以使用C#(.Net)。

无论如何,你必须为这两个移动操作系统构建两个不同的应用程序。


J++已经死了。微软取消了对它的资金支持,并在多年前将人员转移到了C#团队。这一切都是由于微软和Sun之间的法律纠纷所导致的后果。.NET语言可以使用开源平台Mono在Unix平台(Mac、Linux等)上运行,而微软也提供支持。我知道他们正在努力支持Android。他们曾经支持iPhone开发,直到苹果最近的许可证更改使得除了本地Objective-C开发外,其他所有东西都被切断了。 - Cylon Cat
J++不是基于.NET的。它是微软对Java标准的自己实现,大致相当于带有一些Windows特定内容的Java 1。你可能在想J#,它是基于.NET的类Java语言,旨在让Java开发人员更容易地转移到.NET。但它也已经不再受支持了。 - Matt Greer
1
根据您在C语言方面的经验,您可以使用Android的NDK在iPhone和Android之间共享一些代码。 - Don

0

如果你正在考虑进行Android开发,我的最佳建议是选择Java。完全没有必要编写一个完整的抽象层(假设你能够这样做)来将C#转换为Java,因为这样做没有任何好处。至于iPhone开发,同样不要犹豫使用Objective-C。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接