在Android中使用Native的好处

时间:2014-01-16 15:36:20

标签: java android c++ android-ndk

所以我开始了一个学期长的项目,我的小组决定使用Android作为目标平台。这尤其激起了我对某个问题的好奇心。

我想在大多数开发案例中,Java和虚拟机是最好的开发范例。我的问题是:在什么情况下需要使用本机软件开发工具包(C / C ++)而不是Java?

根据Android文档,请记住以下几点:

  • "你应该明白NDK不会让大多数应用受益。作为开发人员,您需要平衡其优势与缺点。值得注意的是,在Android上使用本机代码通常不会带来明显的性能提升,但它总会增加您的应用程序复杂性。 "

  • "一般来说,只有在你的应用程序必不可少时才应该使用NDK,因为你只是喜欢用C / C ++编程。"

  • " NDK的典型优秀候选者是独立的,CPU密集型操作,不会分配大量内存,例如信号处理,物理模拟等。&#34

这是一套非常广泛的陈述(特别是最后一个陈述)。根据我的阅读,现在使用大多数JVM,通过JIT编译执行字节代码的速度几乎或者与直接编译到机器代码一样快。因此,我正在寻找能够在更深层次上澄清的多个回复,更具体地说,我们何时决定使用本地语言进行Android开发,以及这些情况的一些好例子是什么? < / p>

2 个答案:

答案 0 :(得分:2)

正如大家所说,当您需要提高应用程序的性能时,建议使用原生Android编程。但我认为使用NDK可能还有另一个原因:多平台代码。

这听起来很疯狂,而且确实如此。当您使用许多平台目标进行编程时(并且您不使用Xamarin,Corona SDK,Appcelerator等框架),通常您必须重新编写大多数控制器并查看每个平台的代码,而不是非常聪明的方式。

但是,几乎所有的控制器代码都可以使用标准C / C ++进行移植,因为(讽刺!)所有移动平台都支持标准C / C ++,因此您可以将逻辑写入某些libXXX并在所有中重复使用它您的目标平台不会失去很多性能(如Appcelerator或Cordova)。

这是我的意见。

答案 1 :(得分:2)

来自英特尔开发人员专区, NDK Android *应用移植方法Performance Implications and the Cost of JNI

  

具体而言,在Android *应用程序中使用本机代码则不然   保证性能提升!通常,性能提升可以   在本机代码涉及以CPU为中心的情况下受到赞赏   操作(例如 SSE指令的重负荷使用),但是在   其他时候,例如,当时的应用程序是简单的   为用户提供复杂的Web界面,使用本机代码   通过JNI可能会阻碍性能。没有“书面规则”   当NDK应该而且不应该被使用时......

SSE是为复杂算术过程引入的原始MMX指令集的扩展,具有精确性,如3D渲染,游戏,图像处理,语音和手写识别,科学计算等等,因此NDK应该是有用的在这种情况下。

NDK支持以下指令集

  • ARMv5TE,包括Thumb-1指令
  • ARMv7-A,包括Thumb-2和VFPv3-D16指令,可选支持 NEON / VFPv3-D32指令
  • x86说明
  • MIPS说明

NEON技术支持很有意思,并得出相同的结论:

  

可以加速多媒体和信号处理等算法   视频编码/解码,2D / 3D图形,游戏,音频和语音   处理,图像处理,电话和声音合成   至少3倍ARMv5的性能和至少2倍的性能   ARMv6 SIMD。