当前位置: 首页 > 知识库问答 >
问题:

AndroidNDK-Nativeactive vs JNI lib

杨建章
2023-03-14

两年前,我在android-7(艾克蕾尔)上开发了一个增强现实框架。由于AR应用是计算密集型任务,我开发了一个JNI c库,Java活动使用它来渲染和注册虚拟环境。在Java中获得的传感器读数被传递给underline c库,以计算虚拟环境的注册。三维对象是通过从GLSurfaceView调用的本地绘制函数来呈现的。这导致了大量的JNI呼叫。

现在我想将应用程序移植到android-15(冰淇淋三明治)。从android-9(姜饼)开始,Android允许使用Nativeactive。

我想了解开发AR应用程序的更好方法是什么。因为每个JNI调用都会引入开销,所以最好避免它们。使用NativeActivity可能吗?我没有找到一个详尽的指南来解释NativeActivity是如何工作的,但是看了这个文档,它似乎导致了很多JNI调用。有没有什么架构文档解释NativeActivity是如何工作的?NativeActivity只是一个避免java代码的“JNI包装器”吗?关于性能,使用NativeActivity而不是我以前使用的JNI库有什么优势吗?

多谢。

共有2个答案

袁凌
2023-03-14

据我所知,在使用 NativeActivity 时,您仍然受 JNI 的约束。为了方便起见,此类可以用作起点并封装一些功能,但是访问本机代码的底层技术没有改变,并且仍然是JNI。因此,在我看来,您只能进行一些基准测试来检查NativeActivity是否由于某种原因而更有效(可能是Google的家伙确实知道一些使其比您的解决方案更快的黑客)。

白君之
2023-03-14

NativeActivity 不会提高框架的性能。它仍然使用JNI与系统进行通信,只是在掩护下。

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

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

 类似资料:
  • 我试图建立FFMPEG库为我的Android应用程序使用NDK。我已经从它的网站上下载了源代码,我想我构建了它(这是我第一次尝试使用NDK和ffmpeg)。我已经创建了一个文件,我正在使用它从Mac OS X上的命令行执行它。 首先,我知道我需要Android。mk文件,所以我可以在我的应用程序中使用构建的库,但我不知道如何做到这一点,原因我在上面告诉过你。在我运行android文件夹中有一些文件

  • 我的Android应用在使用时崩溃 这是我收到的唯一明显的错误消息: 无法将堆栈跟踪写入/data/anr/跟踪。txt(6738中的5571):没有这样的文件或目录 libMySharedLib.so 是从 ndk-build 生成的。我正在使用powerVR SDK,因此我假设这个库是事先在内部加载的。 如果我将我的代码分离到一个不同的共享库中,我可以让它工作,但这违背了我的需要(所有数据、指

  • 在项目设置(文件- 点击下载Android NDK简短地显示一些对话框。安装了几个版本的NDK: 我的设置有什么问题? 主机:Ubuntu 18.04 LTS Android Studio 4.1.1构建#AI-201.8743.12.41.6953283,构建于2020年11月5日运行时版本: 1.8.0_242-发布-1644-b3-6222593 amd64 VM: OpenJDK 64位服

  • 我刚刚创建了第一个使用JNI和NDK的Android应用程序,简单的Hello JNI。具有返回字符串的唯一函数。我签署了APK解包,如果我看到的.so文件似乎不是本地编译的。我想要一个二进制代码。我读取函数和字符串的名称。我的目标是使用SDK编写本机代码来隐藏未被proguard遮挡的字符串。我用的是Android Studio 2.1.2 建筑格拉德尔项目 Build.Gradle 应用 gr

  • 这是一个普通的问题,但我在stackoverflow中找不到任何类似的问题来讨论Android SDK/NDK最近版本的解决方案。 我的目的是将Android NDK打包为apk文件。 所以: 我将Android NDK安装到 /opt目录-称为 /opt/. 和cd /opt//样本/哪里是任何示例。 然后输入/opt//ndk-build,就编译好了: /opt/Android-SDK-Lin