为什么Android应用程序不能用C/C++编写,因为你"只是喜欢用C/C++编程"?

Log*_*ker 81 c++ java android

更新(为清晰起见并减少歧义):

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

你应该只使用NDK,如果它对你的应用程序至关重要,因为你只是喜欢用C/C++编程.

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


原版的:

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

有些背景,我是计算机科学专业的学生,​​已经修了3门C++课程(介绍,中级,OOP,并且在春季参加STL课程),只有1门Java课程(中级).因此,我对C++更熟悉,更喜欢Java.我在Android NDK页面上看到了以下内容:

在Android上使用本机代码通常不会带来明显的性能提升,但它总会增加您的应用复杂性.一般情况下,如果它对您的应用程序至关重要,您应该只使用NDK,因为您只是喜欢用C/C++编程.

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

任何建议都会非常感激.

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

Dev*_*red 99

这样想吧.您可以使用Java SDK构建一个完整的工作应用程序,该应用程序利用开发人员可用的100%API.NDK无法通过SDK完成任何操作(从API角度来看),NDK只提供更高的性能.

现在反过来看一下.如果您选择在NDK中100%编写应用程序,您仍然可以编写功能齐全的应用程序,但是您可以访问的框架API数量有限.并非所有的Android框架都可以在本机层访问; 大多数API仅限Java.这并不是说可能需要的所有API 在NDK中都不可用,但是所有 API都无法接近.

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

同样,虽然这一切都没有阻止你做你选择的事情,但它指出了为什么谷歌将Java描述为大多数代码的"首选"方法和阻力最小的路径.我希望它能说明为什么文档的措辞方式如此.

  • NDK的限制实际上是一种遗憾.我想为移动平台编写高性能代码,主要是因为电池寿命考虑因素.Native*在移动平台上很重要*.为什么不更好地支持它?#ᴅɪꜱʟɪᴋᴇ (37认同)
  • @LoganBesecker NDK工具链会将您的代码交叉编译为`.so`,用于您选择支持的每个体系结构(由makefile控制),所有文件都将放入APK的libs /目录中.安装APK后,只会选择相应的`.so`,但它们仍然必须存在于初始APK中. (2认同)

Isa*_*aac 24

如果您只想在生活中开发一个应用程序,请使用NDK.

如果你的目标是学习Android开发,意图在你的一生中开发多个应用程序 - 并希望能够正确地支持它们 - 如果你学习Java和Java,那么从长远来看,你很可能做得更好请改用Android的Java SDK.


小智 9

King的程序员使用C++来实现他们的游戏逻辑.从他们的营业额来看,他们似乎做得很好.

根据我的经验,C++用于解决问题,而Java则用于避免问题.我喜欢这两种语言,但是当你编写好的代码时,C++是非常有益的.然而,到达那里可能需要花费几分钟的时间.

您也可以为数据科学家推荐C++,他们通常可以通过Python或者R来完成他们的工作.C++可以做同样好的或不好的性能,但它只是成为语言的天才.这就是为什么我永远不会向想要这样做的人推荐C++ - 我只是提出他们所处的待遇.

  • 任何花在解决 C++ 特有问题上的时间都可以花在构建应用程序的实际功能上。 (2认同)