【问题标题】:Why shouldn't an Android app be written in C/C++ because you "simply prefer to program in C/C++"? [closed]为什么不应该用 C/C++ 编写 Android 应用程序,因为您“只是更喜欢用 C/C++ 编程”? [关闭]
【发布时间】:2012-12-08 01:57:53
【问题描述】:

更新(为了清晰和减少歧义):

我将开始修补 Android 应用程序。我计划使用 NDK 编写 C++(因为我在 C++ 方面有更多经验并且更喜欢它而不是 Java),但在 Android NDK page 上遇到了以下内容:

您应该仅在对您至关重要的情况下使用 NDK 应用程序——绝不是因为您只是更喜欢用 C/C++ 编程。

我的印象是你应该使用你喜欢的语言,只要它适合工作。有人可以解释为什么强烈建议不要使用 C/C++ 进行 android 开发吗?


原文:

我将开始修改移动应用程序,特别是 android,它是我当前手机的操作系统,我想知道是否用 C++(或至少是核心,然后用 Java 包装)编写应用程序是一个可接受的选项。

一些背景知识,我是一名计算机科学专业的学生,​​已经学习了 3 门 C++ 课程(入门、中级、OOP,并且我在春季学习了 STL 课程)和只有 1 门 Java 课程(中级)。正因为如此,我更喜欢 C++ 并且更喜欢它而不是 Java。我在Android NDK page 上看到了以下内容:

在 Android 上使用本机代码通常不会导致明显的 性能改进,但它总是会增加您的应用程序复杂性。 一般而言,您应该只在对您的系统必不可少的情况下使用 NDK 应用程序——绝不是因为您只是更喜欢用 C/C++ 编程。

  • 我的印象是您应该使用合适的语言 这份工作以及您熟悉的工作
  • 我可能想将应用程序移植到另一个移动平台,例如 作为 iOS,支持 C++ 但不支持 java
  • 虽然 Java 是一种高级语言,因此应该进行开发 更快,我觉得开发会更慢,因为我会 重新学习几乎所有东西(因为我只上过一门课 语言)

任何建议将不胜感激。

ps:关于这个主题的许多答案都是几年前的,很少有后续答案提到 NDK 允许在 android 2.3 和更高版本上开发完整的原生应用程序。

【问题讨论】:

  • “可接受”是一个奇怪的词——它肯定是可能的,来自the NDK...
  • 你最好还是硬着头皮学习 Java。 Android 工具包确实是打算从 Java 中使用的,而您从已经知道 C++ 中节省的时间将被花费,然后一些人试图弄清楚如何使所有 Android 的东西在 C++ 中工作。将此视为学习机会:)
  • 就我个人而言,正如 Jeremy 所说,我会咬紧牙关,简单地学习 Java 所需的知识。实际上,相对较快地学习它对您来说那么没什么大不了的。
  • 首先,无论熟悉程度如何,C++ 都不像 Java 那样适合这项工作(为 Android 开发)。对于第二点,尽管 Android 是 Linux,但 Android 和桌面应用程序之间存在巨大差异;生命周期不同,您必须处理活动而不是流程,与普通桌面开发相比,这是一种完全不同的开发方式。对于您的第三点,在 C++ 中学习 Android SDK 将比在 Java 中学习它(在学习 Java 之后)然后切换到 C++ 花费的时间要长得多。
  • 太多人使用“C/C++”这个词,就好像只有一种语言一样。我希望您知道 C 和 C++ 是两种不同(尽管密切相关)的语言——您要问的似乎是 C++,而不是 C。

标签: java android c++


【解决方案1】:

这样想。您可以使用 Java SDK 构建一个完整的工作应用程序,该应用程序利用 100% 的开发人员可用的 API。 NDK 没有什么是 SDK 无法做到的(从 API 的角度来看),NDK 只是提供了更高的性能。

现在反过来看。如果您选择 100% 在 NDK 中编写应用程序,您仍然可以编写功能齐全的应用程序,但是您可以访问的框架 API 的数量受到限制。并非所有 Android 框架都可以在原生层访问;大多数 API 仅是 Java。这并不是说 可能需要的所有 API 在 NDK 中都不可用,但远未公开所有 API。

除此之外,NDK 还引入了特定于平台的代码,可扩展您的发行版的规模。对于您打算支持的每种设备架构,您的本机代码必须内置到 .so 文件中(一个用于 armv5、armv7 和 x86),所有这些文件都打包到同一个 APK 中。除非您在分发应用程序时承担为每个架构构建单独 APK 的任务,否则可执行代码的这种重复会使您的应用程序大小增加 3 倍(即“胖二进制文件”)。因此,如果您不希望 APK 的大小显着增长,那么部署过程就会变得更加繁琐。

再次重申,虽然这些都不会阻止您做自己选择的事情,但它指出了为什么 Google 将 Java 描述为大多数代码的“首选”方法和阻力最小的路径。我希望它能阐明为什么文档的措辞是这样的。

【讨论】:

  • 非常感谢!视角的改变是我错过的重要部分。我不知道 NDK 缺少一些 API。我也没有考虑分布的大小。但是现在您已经想到了它,这很有意义(特别是因为 c++ 必须包含所有标准库,而 java 的标准库已经在设备上)。你能解释一下.so文件吗?我知道每个支持的硬件架构都需要单独编译本机代码,所以每个.so 文件都有单独编译?
  • 对NDK的限制其实很可惜。我很想为移动平台编写高性能代码,主要是出于电池寿命的考虑。移动平台上的原生很重要。为什么不支持更好呢? #ᴅɪꜱʟɪᴋᴇ
  • @LoganBesecker NDK 工具链会将您的代码交叉编译为您选择支持的每个架构的 .so(这由您的 makefile 控制),所有文件都将被放入APK 的 libs/ 目录。安装 APK 时,只会选择适当的 .so,但它们仍然必须存在于初始 APK 中。
  • @KonradRudolph 您可以使用 ndk 编写部分应用程序,Google 这样做是为了 Android 的性能关键部分。除了非常特殊的情况外,c++ vs java 在 Android 开发中是无关紧要的,尤其是现在 ART 即将到来。正确使用 API,尤其是那些耗电的 API(GPS、网络)是您需要小心的地方。
  • Java 比较慢。 JVM 需要加载,加上字节码非常有效,但它不是“本地的”,因此有一个小的损失——取决于应用程序,这可能很明显。至于他们为什么选择 Java,特别是因为它在解释器中运行:垃圾收集器减少了内存问题并减少了跨应用程序的影响。此外,Java 语言(虽然冗长)消除了许多开发人员引入的 C++ 错误。
【解决方案2】:

如果您一生只打算开发一款应用,请使用 NDK。

如果您的目标是学习 Android 开发,并打算在您的一生中开发多个应用程序 - 并且希望能够适当地支持所有应用程序 - 从长远来看,如果您学习 Java 并改用 Android 的 Java SDK。

【讨论】:

  • 这个逻辑很有实际意义。
【解决方案3】:

King 的程序员将 C++ 用于他们的游戏逻辑。从他们的营业额来看,他们似乎做得很好。

根据我的经验,C++ 适合问题解决者,Java 适合问题回避者。我喜欢这两种语言,但是当你写出好的代码时,C++ 是相当有益的。但是,到达那里可能只需要几分钟的魔法。

您也可以向数据科学家推荐 C++,他们通常会通过 Python 或 R 来完成他们的工作。C++ 可以做同样的事情,但性能一样好或不更好,但这需要成为一个天才语言。这就是为什么我永远不会向想要这样做的人推荐 C++ 的原因——我只是对他们想要的款待有所了解。

【讨论】:

  • 只要您花时间解决 C++ 独有的问题,您就可以花时间构建应用的实际功能。
【解决方案4】:

我发现这篇有趣的文章来自: http://betanews.com/2014/07/22/why-c-is-the-perfect-choice-for-modern-app-development/

C++ 是专门为独立于平台而构建的,因此存在于每个现有的操作系​​统中。您的典型移动用户可能知道 Android 应用程序是用 Objective-C 编写的 Java 和 iOS 应用程序,但许多人不知道的是,您的设备内存中的 C/C++ 代码比其他任何东西都多。 C/C++ 驱动了许多小型设备(如与硬件交互的内核以及典型的运行时库)和支持这些设备的电信网络的技术。对于开发团队而言,更重要的是,有 C/C++ 接口和库可用于您需要在任何设备和平台上执行的任何操作。 Android NDK 工具集是完整的 C/C++ 支持的一个很好的例子,它最初是为游戏开发团队添加的,使他们能够通过避免 Java 和 Android Java 运行时 Dalvik 来获得设备的最佳性能。 Android Java 代码在其上执行。它已定期进行改进以启用所有 Android 服务。

【讨论】:

    【解决方案5】:

    最重要的考虑是编译后的 Java 代码将在所有 android 设备上运行时保持不变,而原生代码则需要针对所有目标平台进行编译。

    Java 和 Android 的总体意图是,您使用 Java 编写大部分(如果不是全部)应用程序,并且只有在没有其他选择时才使用本机内容......所以关于编写应用程序的所有内容都适合这样做在 Java 中。

    通过使用 Java 编写,您可以避免在本地和 Java 世界之间架起一座桥梁。

    同样,如果您冒险学习 Java,您将对自己大有裨益。您的 Android 应用不仅会因此而变得更好,而且您将使自己接触到一种截然不同的 OO 方法,并且您将成为更好的程序员。

    此外,您还可以通过使用 Java 编写来规避一大堆安全风险。

    在我看来,这很简单——使用 Java。

    【讨论】:

    • "...只有在没有其他选择的情况下才使用原生的东西"。什么时候别无选择? Android 上的一切都可以通过 Java 实现!
    【解决方案6】:

    我会说将 java 用于主应用程序。但是,如果您有一些需要移植的 c++ 代码或一些需要在 c++ 中有效实现的库,那么请使用 ndk 来处理这些位

    【讨论】:

    • 那他为什么要使用Java呢?
    【解决方案7】:

    我认为没有任何理由不使用 C++ 进行正常的 android 开发,如果你在 C++ 和复杂的操作系统(如 windows 或任何其他操作系统)方面有丰富的工作经验,那么你可以快速掌握 android 并且没有那么多和其他操作系统一样复杂。在学习java或不学习的情况下工作会更令人沮丧和复杂!

    【讨论】:

      猜你喜欢
      • 2010-11-03
      • 2011-02-28
      • 2017-03-19
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-27
      相关资源
      最近更新 更多