如何在Android和iOS之间进行代码共享

Son*_*man 44 iphone android sharing

我正在摆脱严格的Android开发,并希望创建iPhone应用程序.我的理解是,我可以用C/C++编写iOS应用程序的后端代码,还可以使用NDK在Android应用程序中包含C/C++代码.我的问题是如何?我用Google搜索了一下,我找不到任何简洁明了的答案.在查看NDK的示例代码时,似乎所有函数名称等都是Android(或至少是Java)特定的,因此我无法使用此C/C++后端来开发iPhone前端?我很欣赏这个问题的一些澄清,如果可以提供一些代码来帮助我?(甚至只是一个简单的Hello World,它从C/C++文件中读取一个字符串并在iOS和Android应用程序中显示它).

谢谢你们克里斯

Rob*_*ier 69

请注意,我几乎专门从事"业务/实用/生产力"应用程序; 那些严重依赖于相当标准的UI元素并期望与他们的平台很好地集成的东西.这个答案反映了这一点 请参阅Mitch Lindgren对Shaggy Frog的回答,为游戏开发者提供良好的评论,他们的情况完全不同.

我相信@Shaggy Frog在这里不正确.如果你在C++中有经过验证的有效代码,那么就没有理由不在Android和iPhone之间共享它,而且我已经完成了那些做到这一点的项目,它可以非常成功.但是,应该避免危险.

最关键的是,要小心"最低共同点".自包含的算法代码非常好用.管理线程,在网络上交谈或以其他方式与操作系统交互的复杂框架更难以以一种不会迫使您打破平台范例并为在所有平台上同样严重工作的LCD进行拍摄的方式进行操作.特别是,我建议使用平台的框架编写网络代码.这通常需要"三明治"方法,其中顶层是特定于平台的,而最底层是特定于平台的,并且中间是便携式的.如果仔细设计,这是一件非常好的事情.

线程管理和计时器也应该使用平台的框架来完成.特别是,Java大量使用线程,而iOS通常依赖其runloop来避免线程.当iOS确实使用线程时,GCD是首选.同样,这里的解决方案是隔离真正的可移植算法,并让特定于平台的代码管理它的调用方式.

如果你有一个复杂的现有框架,它有很多线程,并且有很多网络或UI代码遍布它,那么分享它可能很困难,但我的建议仍然是寻找重构它而不是重写它的方法.

作为一名iOS和Mac开发人员,他在Linux,Windows和Android上共享跨平台代码,我可以说Android是迄今为止最容易与之共享的平台(Windows曾经有过这种区别,但Android却爆发了它离开).在大多数情况下,Android共享代码并不明智.但是仍然有许多代码重用的机会,应该追求它们.

  • 我推荐原生网络.您可以获得更好的电源管理,与证书密钥链,代理,身份验证系统和更简单的代码集成.NSURLConnection比cURL更容易处理(已经完成了很多cURL工作).Android也有很好的原生网络支持.最好使用GCDAsyncSocket https://github.com/robbiehanson/CocoaAsyncSocket/wiki/Intro_GCDAsyncSocket在iOS上处理低级套接字.这正是您不应该分享的代码.当您尝试时,您最终会手动管理NTLM身份验证,而不是免费获取(真实故事). (2认同)
  • 如果通过Web服务,你的意思是SOAP,那么这对iOS来说真的很痛苦,我推荐使用REST.两者都易于使用,我不建议共享代码.RESTKit或MKNetworkKit或其他适用于iOS的REST工具包太棒了.让所有网络本地完成,然后只是消费共享C++中的数据,如果这种代码共享对您真正有益(但将C++集成到Android中是一个痛苦,所以最好是一个主要的好处). (2认同)

Sha*_*rog 4

虽然这种情绪是合理的(您遵循“不要重复自己”的政策),但只有当您能够以有效的方式共享该代码时,这才是务实的。在这种情况下,实际上不可能采用“一次编写”的跨平台开发方法,因为两个平台的代码需要用不同的语言编写(iPhone 上的 C/C++/Obj-C,Android 上的 Java)。

在这种情况下(用两种不同的语言)编写两个不同的代码库会更好。建议:不要像编写 C++ 代码一样编写 Java 代码,也不要像编写 Java 代码一样编写 C++ 代码。几年前,我在一家公司工作,他们有一个产品从 Java“移植”到 C++,他们没有像 C++ 那样编写 C++ 代码,这导致了各种各样的问题,更不用说很难了读书。

  • 我否决了这个答案,因为我认为它掩盖了 NDK 的好处。Android 应用程序中唯一必须用 Java 编写的部分是使用 Android 库的部分。如果 UI 交互和/或网络通信之类的东西构成了你的大部分代码库,那么我同意你使用 C++ 是在搬起石头砸自己的脚。但对于后端仅具有薄 UI 层且不依赖于特定于平台的库的游戏或应用程序来说,NDK 绝对是最佳选择。Rob 在他的回答中很好地概述了 NDK 的优缺点。 (14认同)
  • 实际上,时间关键/性能关键的组件正是您“应该”为每个设备本地编写的类型。(听起来你正在编写代码来实现隐马尔可夫模型) (2认同)
  • 懒惰对于程序员来说是一个很好的品质(它是三美之一),但是在应用它的时候你必须务实。不想写两次代码是一个好的态度。然而,当这让你因为试图为两种完全不同的语言编写一组代码而经历巨大的困难时,那么付出的努力就得不偿失了。 (2认同)