45

我正在摆脱严格的 Android 开发并希望创建 iPhone 应用程序。我的理解是,我可以用 C/C++ 编写 iOS 应用程序的后端,也可以使用 NDK 在 Android 应用程序中包含 C/C++ 代码。然而,我的问题是如何?我用谷歌搜索了很多,但找不到任何清晰简洁的答案。在查看 NDK 的示例代码时,似乎所有函数名称等都是 Android(或至少是 Java)特定的,所以我不能使用这个 C/C++ 后端来开发 iPhone 前端?我很感激对这个问题的一些澄清,如果有一些代码可以帮助我吗?(甚至只是一个简单的 Hello World,它从 C/C++ 文件中读取字符串并将其显示在 iOS 和 Android 应用程序中)。

谢谢克里斯

4

6 回答 6

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 在大多数情况下共享代码是不明智的。但是代码重用的机会还是很多的,应该去追求。

于 2011-03-08T15:53:37.433 回答
4

While the sentiment is sound (you are following the policy of Don't Repeat Yourself), it's only pragmatic if what you can share that code in an efficient manner. In this case, it's not really possible to have a "write once" approach to cross-platform development where the code for two platforms needs to be written in different languages (C/C++/Obj-C on iPhone, Java for Android).

You'll be better off writing two different codebases in this case (in two different languages). Word of advice: don't write your Java code like it's C++, or your C++ code like it's Java. I worked at a company a number of years ago who had a product they "ported" from Java to C++, and they didn't write the C++ code like it was C++, and it caused all sorts of problems, not to mention being hard to read.

于 2010-09-08T17:35:51.343 回答
2

除了使用C/C++共享so lib。

如果要开发像游戏这样的跨平台应用程序,建议使用Unity3D等基于单声道的框架。

否则如果开发需要原生 UI 的业务应用,想要跨移动平台共享业务逻辑代码,我建议使用Lua嵌入式引擎作为客户端业务逻辑中心。

客户端 UI 仍然是原生的并获得最佳的 UI 性能。即 Android 上的 Java 和 iOS 上的 ObjectC 等。逻辑与所有平台的相同 Lua 脚本共享。所以 Lua 层类似于客户端服务(与服务器端服务相比)。

——毛泽东,2013-03-28

于 2013-03-28T08:34:36.583 回答
2

我对类似问题发布了相同的答案,但我认为它是相关的,所以......

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

在我的电脑上

  • gamename- 只包含通用代码

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

  • gamename-win32- 仅用于构建到 Windows,使用来自游戏名称项目的代码

在我的 Mac 上

  • gamename- 只包含通用代码

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

  • gamename-osx- OSX 本机构建。导入通用代码。

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

所有这些东西都随 BatteryTech 一起提供,所以一旦你得到它就很容易弄清楚。

于 2011-03-25T19:58:36.333 回答
2

在这种情况下,编写共享代码库非常实用。设置和保持组织有一些开销,但主要好处是这些 1) 通过共享通用功能减少代码量 2) 共享通用代码库的错误修复。我目前知道我正在为一个项目考虑的两条路线 - 使用本机 c/c++(以丢失垃圾收集和为每个处理器设置目标为代价来提高速度)或使用 提供 c# 绑定的monodroid/monotouch每个操作系统的平台功能(我不确定这有多成熟。)

如果我使用 3d 编写游戏,我肯定会使用方法 #1。

于 2011-03-08T15:37:49.190 回答
1

虽然我自己不使用这些,因为我编写的大多数东西都不能很好地移植,但我建议使用AppceleratorRed Foundry之类的东西来构建可以在任一平台上本地创建的基本应用程序。在这些情况下,您不是在编写objective-c 或java,而是使用某种中介。请注意,如果您移出他们限制您的盒子,您将需要编写自己的代码更接近金属。

于 2011-03-11T20:13:12.123 回答