【问题标题】:Porting Visual C/C++ to Android, stopover at linux?将 Visual C/C++ 移植到 Android,在 linux 中途停留?
【发布时间】:2012-08-16 20:20:12
【问题描述】:

在我最近开始的实习中,我需要将一个相当大的 Visual C/C++ 项目移植到 Android。 我昨天问了另一个question 关于这个话题,寻求一些帮助来寻找移植的概念。 我得到了一个建议使用自动化解决方案的答案(例如用于 android 的单声道),但是经过一天对我的概念进行明确的研究后,我倾向于使用“手动解决方案”,这意味着我手动删除所有 Windows 和 Visual 特定的将其替换为 Android 下可用的功能。

现在,我想到的第一件事是首先使用 windows gnu Complier 删除所有 Visual 特定的内容,然后使用 linux gnu Compiler 删除所有与 Windows 相关的内容(然后使用ndk)。

这意味着我将它从 Windows 移植到 Linux,而不是从 Linux 移植到 Android,假设从 Linux 到 Android 的步骤非常小,因为我希望代码从 Linux 到 Android 几乎可以保持不变,因为 Android 是基于在 Linux 内核上。

现在我的问题是:这是一个好主意,还是从 Linux 移植到 Android 也是一项巨大的努力,所以我会做两次所有工作,一次从 Windows 到 Linux,另一次从 Linux 到 Android?!

绝对欢迎提出如何做得更好的建议!

编辑:忘记提一下,这将是一个更大的应用程序的一部分,并且不包含任何 GUI 东西(当然我知道这是因为,尽管 linux 到 Android 步骤会很繁重),只是组件的接口位于上面和下面。

【问题讨论】:

  • 不要只是删除或替换 Windows 特定的部分,而是尝试使用更抽象的接口或包装器,这些接口或包装器可以根据其内置的环境调用正确的 Windows、Linux 或 Android 代码。这可能需要更多工作一开始,但以后会更容易移植。
  • @nurgan,能否请您提供您的联系信息,我们需要您的建议,因为我们有一个类似的项目来移植 android .. 谢谢
  • 我其实不知道这个项目是怎么结束的,因为我得到了'大量支持',我取消了我在这家公司的实习......

标签: android linux visual-c++ android-ndk porting


【解决方案1】:

不要尝试手动删除“Windows 的东西”。

改为创建一个“仿真层” - 在标题中定义项目使用的所有 Windows 函数并编写它们的主体。

因此,您的项目不会受到影响,甚至可以采用新版本(如果有的话)。

在移植 Windows->Linux 时,您可能会遇到以下“大”问题:

  • Windows 注册表仿真
  • windows 多线程模型和IPC 翻译成Linux 术语有点困难。尤其是 SetEvent 和 WaitForMultipleObjects
  • GUI(但我明白,你没有)

移植Linux->Android最大的麻烦应该是UI。如果您不涉及用户交互,我建议先移植 win->lin。

如果需要,您可以从 Linux 中引入和构建缺少的库。

如果需要任何用户交互,您可能希望用 Java 编写原生 Android 前端应用程序,并通过 D-Bus 与您的主程序进行交互。

【讨论】:

  • 你说得对,“仿真层”比对正在运行和测试的代码进行一些丑陋的编辑要好得多,但我的问题也可以参考这个。首先为Linux做“仿真层”更好吗?工作两次——因为“仿真层”的变化并没有我想象的那么小——在这种情况下?
  • 好的,这取决于您的应用程序与操作系统的交互级别。尝试列举此类交互的主要领域,我将在答案中添加可能的影响描述。
  • 嗯,到处都有多线程(不多),而且确实有很多句柄(它们是特定于 windows 的,不是吗?我对 c/c++ 编程不太深入...)...
  • 谢谢,这对我很有帮助。让我重新振作起来,我第一次猜测首先将它移植到 linux 而不是它只是向 android 迈出的一小步是正确的(仍然不包括 gui),如果我猜那是错误的,我的世界观将会崩溃...... :)
  • 你还有很多工作要做。我过去做过这样的移植,虽然第一个 alfa 是在一个月后出现的,没有改动逻辑和 Windows 仿真,但在最终版本中,我重写了多线程逻辑和 IPC...