如何在Android和iOS之间进行代码共享
我正在摆脱严格的Android开发,并希望创buildiPhone应用程序。 我的理解是,我可以用C / C ++编写iOS应用程序的后端,也可以使用NDK在Android应用程序中包含C / C ++代码。 然而,我的问题是如何? 我search了很多,我找不到任何清晰和简洁的答案。 在查看NDK的示例代码时,似乎所有的函数名称都是Android(或者至less是Java)特定的,所以我不能使用这个C / C ++后端来开发iPhone前端? 我很感谢在这个问题上的一些澄清,如果在所有可用的代码来帮助我? (即使只是一个简单的Hello World,它可以从C / C ++文件读取一个string,并将其显示在iOS和Android应用程序中)。
谢谢你们Chris
虽然情感是正确的(您遵循不要重复自己的政策),但只有实用性,您可以有效地分享该代码。 在这种情况下,对于需要用不同语言(iPhone上的C / C ++ / Obj-C,Android上的Java)编写两种平台的代码的跨平台开发方法,实际上是不可能的。
在这种情况下,用两种不同的语言编写两个不同的代码库会更好。 build议的意见:不要把你的Java代码写成C ++,要么写C ++代码,就像Java一样。 几年前,我曾在一家公司工作,他们有一个产品,他们从Java移植到C ++,他们没有像C ++那样编写C ++代码,而是造成各种各样的问题,更不用说很难读书。
请注意,我几乎专门从事“商业/实用/生产力”应用程序; 那些严重依赖相当标准的UI元素,并期望能够很好地与他们的平台集成的东西。 这个答案反映了。 看到米奇·林德格林(Mitch Lindgren)对毛茸茸的青蛙(Shaggy Frog)的回应,对游戏开发者的好评,他们的情况完全不同。
我相信@毛茸茸的青蛙在这里是不正确的。 如果你在C ++中有有效的,经过testing的代码,那么没有理由不在Android和iPhone之间共享它,我已经在做这个项目,并且可以非常成功。 但是,有些危险应该避免。
最关键的是,要小心“最低的共同点”。 自包含的algorithm代码非常好。 pipe理线程,在networking上交谈或者与操作系统进行交互的复杂框架,在一个不会迫使你打破平台范例的情况下,以及在所有平台。 特别是,我build议使用平台的框架编写你的networking代码。 这通常需要一个“三明治”方法,其中最上层是平台特定的,最底层是平台特定的,中间是便携式的。 如果仔细devise,这是一件非常好的事情。
线程pipe理和定时器也应该使用平台的框架来完成。 特别是,Java大量使用线程,而iOS通常依靠其runloop来避免线程。 当iOS使用线程时,GCD是首选。 同样,这里的解决scheme是隔离真正的便携式algorithm,让平台特定的代码pipe理它被调用的方式。
如果你有一个复杂的,现有的框架,这是一个严重的线程,并有大量的networking或UI代码传播,然后分享它可能是困难的,但我的build议仍然是寻找方法来重构它,而不是重写它。
作为一名在Linux,Windows和Android上共享跨平台代码的iOS和Mac开发人员,我可以说Android是迄今为止最令人厌烦的平台之一(Windows用来保持这个区别,但Android自爆它走了)。 Android最常见的情况是分享代码不明智。 但是代码重用的机会还是很多的,应该追求。
编写一个共享代码库在这种情况下非常实用。 有一些开销,build立和保持它的组织,但主要的好处是这些1)通过共享共同的function减less代码量2)共享错误修复到公共代码库。 我目前知道两个路线,我正在考虑一个项目 – 使用原生c / c + +(增加速度的损失垃圾收集和设置每个处理器的目标)或使用monodroid / monotouch提供的c#绑定每个os的平台function(我不确定这是多么成熟)。
如果我正在用3d写一个游戏,我一定会使用方法#1。
我发表了同样的答案,但我认为这是相关的…
我使用BatteryTech作为我的平台抽象的东西,我的项目结构如下所示:
在我的电脑上 :
-
gamename
– 只包含通用代码 -
gamename-android
– 主要包含gamename-android
的android专用代码和Androidconfiguration,构build者指向通用代码的gamename项目 -
gamename-win32
– 只用于构build到Windows,使用gamename项目的代码
在我的Mac上 :
-
gamename
– 只包含通用代码 -
gamename-ios
– iPhone / iPad构build,导入通用代码 -
gamename-osx
– OSX本机构build。 导入通用代码。
我使用SVN在我的PC和Mac之间共享。 我唯一真正的问题是当我添加类到Windows中的公共代码库,然后在Mac上更新从SVN拉下来。 XCode没有办法在没有脚本的情况下自动将它们添加到项目中,所以我必须每次手动将它们拖入,这是一个痛苦,但不是世界末日。
所有这些东西都与BatteryTech一起提供,所以一旦得到它就很容易弄清楚。
除了使用C / C ++共享so lib。
如果要开发像游戏这样的跨平台应用程序,build议使用Unity3D之类的基于单语的框架。
否则,如果开发的业务应用程序需要本地用户界面,并希望跨移动平台共享业务逻辑代码,我build议使用Luaembedded式引擎作为客户端业务逻辑中心。
客户端用户界面仍然是原生的,并获得最佳的UI性能 。 即Android上的Java和iOS上的ObjectC等。逻辑与所有平台的Lua脚本共享。 所以Lua层与客户端服务类似(与服务器端服务相比)。
– 安德森毛,2013-03-28
虽然我并没有使用这些我自己写的东西,但是我写的东西不能很好地传输,所以我推荐使用Appcelerator或者Red Foundry这样的东西来构build基本的应用程序,这些应用程序可以在任何平台上本地创build。 在这些情况下,您不是在编写objective-c或java,而是使用某种中介。 请注意,如果您移动到他们所限制的框之外,则需要将自己的代码编写得更接近金属。