Android NDK - NativeActivity与JNI lib

时间:2012-11-29 11:13:31

标签: android android-ndk java-native-interface

两年前,我在android-7 (Eclair)上开发了一个增强现实框架。由于AR应用程序是计算密集型任务,因此我开发了Java活动使用的JNI c ++库来呈现和注册虚拟环境。在Java中获取的传感器读数被传递到下划线c ++库以计算虚拟环境的注册。三维对象由从GLSurfaceView调用的本机绘制函数呈现。这导致了大量的JNI调用。

现在我想将应用程序移植到android-15(Ice Cream Sandwich)。从android-9(Gingerbread) Android开始,允许使用NativeActivity

我想了解哪种是开发AR应用程序的更好方法。由于每个JNI调用都会引入开销,因此避免它们会好得多。是否可以使用NativeActivity?我没有找到解释NativeActivity如何工作的详尽指南,但是阅读this document似乎无论如何都会导致很多JNI调用。是否有任何架构文档可以解释NativeActivity的工作原理? NativeActivity只是一个“JNI包装器”来避免java代码吗?关于性能,使用NativeActivity而不是像以前那样使用JNI库有什么好处吗?

非常感谢。

2 个答案:

答案 0 :(得分:5)

NativeActivity不会为您的框架带来性能提升。它仍然使用JNI与系统进行通信,仅在封面下。

此外,有充分的理由不使用它。如果我正确理解您的目的,您希望其他应用程序利用您的代码。通过强制他们使用NativeActivity,您会严重降低他们的自由,并要求他们在不太熟悉的环境中挣扎。 NativeActivity有许多限制,例如:它无法加载多个JNI库。

最后,如果您希望优化AR框架,我建议采用完全不同的方向:您可以使用新的setPreviewTexture() API。

答案 1 :(得分:0)

据我了解,在使用NativeActivity时,您仍然可以使用JNI。这个类可以作为起点使用并封装一些功能以方便您使用,但访问本机代码的基础技术并没有改变,仍然是JNI。因此,在我看来,你只能做一些基准来检查NativeActivity是否因某些原因更有效率(可能是谷歌的人确实知道一些黑客比你的解决方案更快)。