两年前,我在android-7 (Eclair)上开发了增强现实框架。由于AR应用程序是计算密集型任务,因此我开发了Java Activity 用来渲染和注册虚拟环境的JNI c++库。用Java获取的传感器读数传递到下划线c++库,以计算虚拟环境的注册。三维对象由从GLSurfaceView调用的 native 绘制函数渲染。这导致大量的JNI调用。
现在,我想将应用程序移植到android-15(Ice Cream Sandwich)。从android-9(Gingerbread)开始,Android允许使用NativeActivity。
我想了解哪种是开发AR应用程序的更好方法。由于每个JNI调用都会带来开销,因此避免它们会更好。是否可以使用NativeActivity?我没有找到说明性的指南来解释NativeActivity的工作原理,但是阅读this document似乎仍然会导致很多JNI调用。是否有任何架构性文件可以解释NativeActivity的工作方式? NativeActivity只是避免Java代码的“JNI包装器”吗?关于性能,使用NativeActivity代替我以前做过的JNI库有什么好处吗?
非常感谢。
最佳答案
NativeActivity不会提高您的框架的性能。它仍然仅在幕后使用JNI与系统通信。
此外,有充分的理由不使用它。如果我正确理解您的目的,则希望其他应用程序利用您的代码。通过强制他们使用NativeActivity,您会严重降低他们的自由度,并要求他们在不那么熟悉的环境中挣扎。 NativeActivity有很多限制,例如它不能加载多个JNI库。
最后,如果您要优化AR框架,我会建议一个完全不同的方向:可以使用新的setPreviewTexture() API。