所以我开始了一个学期长的项目,我的小组决定使用Android作为目标平台。这尤其激起了我对某个问题的好奇心。
我想在大多数开发案例中,Java和虚拟机是最好的开发范例。我的问题是:在什么情况下需要使用本机软件开发工具包(C / C ++)而不是Java?
根据Android文档,请记住以下几点:
"你应该明白NDK不会让大多数应用受益。作为开发人员,您需要平衡其优势与缺点。值得注意的是,在Android上使用本机代码通常不会带来明显的性能提升,但它总会增加您的应用程序复杂性。 "
"一般来说,只有在你的应用程序必不可少时才应该使用NDK,因为你只是喜欢用C / C ++编程。"
" NDK的典型优秀候选者是独立的,CPU密集型操作,不会分配大量内存,例如信号处理,物理模拟等。&#34
这是一套非常广泛的陈述(特别是最后一个陈述)。根据我的阅读,现在使用大多数JVM,通过JIT编译执行字节代码的速度几乎或者与直接编译到机器代码一样快。因此,我正在寻找能够在更深层次上澄清的多个回复,更具体地说,我们何时决定使用本地语言进行Android开发,以及这些情况的一些好例子是什么? < / p>
答案 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支持以下指令集
NEON技术支持很有意思,并得出相同的结论:
可以加速多媒体和信号处理等算法 视频编码/解码,2D / 3D图形,游戏,音频和语音 处理,图像处理,电话和声音合成 至少3倍ARMv5的性能和至少2倍的性能 ARMv6 SIMD。