92

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

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

你应该只在对你的应用程序必不可少的情况下使用 NDK——<strong>永远不要因为你只是更喜欢用 C/C++ 编程。

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


原来的:

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

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

在 Android 上使用本机代码通常不会带来明显的性能提升,但它总是会增加应用程序的复杂性。通常,您应该只在对您的应用程序必不可少的情况下使用 NDK——<strong>永远不要,因为您只是更喜欢使用 C/C++ 编程。

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

任何建议将不胜感激。

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

4

7 回答 7

115

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

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

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

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

于 2012-12-08T02:51:01.657 回答
25

如果您一生中只打算开发一个应用程序,请使用 NDK。

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

于 2012-12-08T02:03:28.487 回答
8

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

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

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

于 2015-08-10T14:17:38.013 回答
4

最重要的考虑是编译后的 Java 代码将在所有 android 设备上运行,而本机代码需要为所有目标平台编译。

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

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

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

除此之外,您将通过用 Java 编写来回避一大堆安全风险。

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

于 2012-12-08T02:12:09.687 回答
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 服务。

于 2016-01-17T03:02:52.387 回答
3

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

于 2013-10-26T10:48:18.667 回答
3

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

于 2015-06-19T03:41:50.130 回答