6

两年前,我在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 如何工作的详尽指南,但阅读此文档似乎无论如何都会导致大量 JNI 调用。有没有解释 NativeActivity 如何工作的架构文档?NativeActivity 是否只是避免 Java 代码的“JNI 包装器”?关于性能,使用 NativeActivity 而不是像我以前那样使用 JNI 库有什么优势吗?

非常感谢。

4

2 回答 2

5

NativeActivity 不会为您的框架带来性能提升。它仍然使用 JNI 与系统通信,只是在掩护下。

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

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

于 2012-11-29T16:15:09.860 回答
0

据我了解,在使用 NativeActivity 时,您仍然必须使用 JNI。这个类可以作为起点,为了方便起见封装了一些功能,但是访问本机代码的底层技术没有改变,仍然是 JNI。所以在我看来,你只能做一些基准测试来检查 NativeActivity 是否由于某种原因更有效(可能是谷歌的人确实知道一些让它比你的解决方案更快的技巧)。

于 2012-11-29T11:40:28.413 回答