为什么不应该用C / C ++编写Android应用程序,因为“您只喜欢用C / C ++编程”?[关闭]


86

更新(为清楚起见,以减少歧义):

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

仅当NDK对您的应用程序至关重要时,才应使用NDK-决不因为您只喜欢使用C / C ++进行编程。

我的印象是,只要适合您的工作,就应该使用自己喜欢的语言。有人可以解释为什么不建议在Android开发中使用C / C ++吗?


原版的:

我将开始研究移动应用程序,特别是android,这是我当前手机的操作系统,我想知道是否可以用C ++(或至少是核心,然后用Java包装)编写该应用程序。

在某些背景下,我是一名计算机科学专业的人,修过3门C ++课程(入门,中级,OOP,并在春季学习STL课程),而只修过1门Java课程(中级)。因此,我对C ++更加满意,并且更喜欢Java。我在Android NDK页面上遇到了以下内容:

通常,在Android上使用本机代码不会带来明显的性能改善,但始终会增加应用程序的复杂性。通常,仅应在对您的应用程序至关重要的情况下使用NDK,决不能使用NDK,因为绝对不要只喜欢使用C / C ++进行编程。

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

任何建议将不胜感激。

ps:关于这个问题的许多答案都来自几年前,并且很少有提及NDK的后续答案,因为它允许在android 2.3及更高版本上开发完整的本机应用程序。


1
“可接受”是一个奇怪的词–通过NDK肯定有可能...
ildjarn

1
您最好还是硬着头皮学习Java。Android工具箱实际上是打算从Java使用的,花了您已经了解C ++的时间,然后花了一些时间试图弄清楚如何使所有Android东西都可以从C ++工作。认为这是一个学习的机会:)
杰里米·弗里斯纳

就个人而言,我会像Jeremy所说的那样硬着头皮,只是简单地学习一下Java的需求。它实际上不应该什么大不了的事让你了解它比较快的。
OmniOwl 2012年

首先,无论熟悉度如何,C ++都无法像Java那样胜任(为Android开发)的工作。关于第二点,尽管Android是Linux,但Android和桌面应用程序之间还是有很大差异。生命周期是不同的,因此您必须处理活动而不是流程,与普通桌面开发相比,这是一种完全不同的开发方式。第三点,学习C ++的Android SDK所花的时间要比先学习Java(学习Java之后)然后再切换到C ++的时间长得多。
Cornstalks

1
太多的人使用术语“ C / C ++”,就好像只有一种语言使用该名称一样。我希望您知道C和C ++是两种不同的(尽管密切相关)语言-您正在询问的似乎是C ++,而不是C。
基思·汤普森

Answers:


107

这样想吧。您可以使用Java SDK来构建可以正常使用的应用程序,该应用程序可以充分利用开发人员可用的API的100%。从SDK角度(从API角度来看),NDK不能做任何事情,而NDK只能提供更高的性能。

现在反过来看。如果您选择在NDK中100%编写应用程序,则仍然可以编写功能完整的应用程序,但是可以访问的框架API数量有限。并非所有Android框架都可以在本机层进行访问。大多数API仅是Java。这并不是说可能需要的所有API在NDK中都不可用,但是所有API都没有公开。

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

同样,尽管这一切都不能阻止您进行选择,但它指出了Google为什么将Java描述为大多数代码和最小阻力路径的“首选”方法。我希望它能阐明为什么文档的原样。


1
非常感谢你!观点的改变是我最想念的部分。我不知道NDK缺少一些API。我也没有考虑发行版的大小。但是现在您已经想到了它(特别是因为c ++必须包括所有标准库,而Java的标准库已经在设备上了),这很有意义。您能解释一下.so文件吗?我知道对于支持的每种硬件体系结构,都需要对本机代码进行单独的编译,因此每个.so文件都有单独的编译?
Logan Besecker

42
NDK的限制实际上是一个遗憾。我很想为移动平台编写高性能的代码,主要是出于电池寿命的考虑。移动平台上的本地事务。为什么不更好地支持它?#ᴅɪꜱʟɪᴋᴇ
康拉德·鲁道夫

2
@LoganBesecker NDK工具链会将您的代码交叉编译.so为您选择支持的每种体系结构的代码(这由您的makefiles控制),所有文件都将放置在APK的libs /目录中。安装APK后,只会.so选择适当的APK ,但它们仍然必须保留在初始APK中。
devunwired

1
@KonradRudolph,您可以使用ndk编写应用程序的一部分,而Google则是针对Android的性能关键部分。除了非常特殊的情况外,C ++与Java在Android开发中无关紧要,尤其是在ART即将问世的情况下。您需要注意正确使用API​​,尤其是那些消耗电池(GPS,网络)的API。
Teovald

1
Java较慢。JVM需要加载,加上字节码非常有效,但它不是“本机”的,因此代价不菲-取决于应用程序,这可能很明显。至于为什么选择Java,特别是因为Java在解释器中运行:垃圾收集器减少了内存问题并减少了跨应用程序的影响。此外,Java语言(虽然冗长)消除了许多开发人员引入的C ++错误。
丹尼尔(Daniel)

25

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

如果您打算学习Android开发并打算在自己的一生中开发多个应用程序,并且希望能够适当地支持它们,那么从长远来看,如果您学习Java和请改用Android的Java SDK。


这种逻辑有很多实际意义。
vvnraman

8

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

以我的经验,C ++适用于问题解决者,而Java适用于问题避免者。我喜欢这两种语言,但是当您编写出色的代码时,C ++会很有意义。但是,到达那里可能只需要花一些时间。

您也可以向数据科学家推荐C ++,他们通常可以通过Python或R来完成他们的工作。C++可以完成相同的工作,无论性能好与坏,但是这只是语言的天才。这就是为什么我永远不会向想要这样做的人推荐C ++的原因-我只是直言不讳地介绍他们所追求的目标。


1
任何时候花在解决C ++特有的问题上的时间都是花在构建应用程序实际功能上的时间。
user45623

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服务。


3

我会说将Java用于主要应用。但是,如果您需要一些c ++代码,则需要移植或使用c ++有效实现的某些库,然后将ndk用于这些位


4
那他为什么要使用Java?
Vladislav Rastrusny

3

我认为没有理由不使用C ++进行正常的android开发,如果您在使用C ++和复杂的OS(例如Windows或其他类似软件)上具有丰富的工作经验,那么您可以快速掌握android,并且没有Windows复杂得多其他操作系统。在学习Java或不学习而工作的情况下,这将更加令人沮丧和复杂!


3

最重要的考虑因素是,已编译的Java代码将在所有android设备上不变运行,而本机代码则需要针对所有目标平台进行编译。

Java和Android的总体意图是,如果不是用Java编写所有应用程序,则大多数情况下使用,而只有在没有其他选择时才使用本机代码,因此有关编写应用程序的所有内容都将使用Java编写。

通过使用Java编写,您将在本机和Java世界之间建立桥梁时会费尽心机。

同样,如果您愿意尝试并学习Java,也会对自己有很大帮助。不仅您的Android应用程序会变得更好,而且您将面临一种截然不同的面向对象方法,并且您将成为一个更好的程序员。

此外,您将通过编写Java来避免很多安全风险。

在我看来,这很容易-使用Java。


2
“ ...只有在没有其他选择时才使用本机”。什么时候别无选择?Android上的所有内容都可以通过Java实现!
CinCout
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.