两年前,我在 android-7 (Eclair) 上开发了一个增强现实框架.由于 AR 应用程序是计算密集型任务,我开发了一个 JNI c++ 库,Java Activity 使用它来呈现和注册虚拟环境。在 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。
关于Android NDK - NativeActivity 与 JNI 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13624499/
我曾尝试搜索Internet和StackOverflow(文章太多,无法计数)但无法找到包含所有这些内容的帮助:比2013年更近开发时不需要Cygwin在Windows上适用于AndroidStudio,而非Eclipse。我是第一次涉足Android开发,我新加入的项目依赖于使用NDK进行开发。我一直在阅读NDK附带的文档,但遇到了这个示例的障碍。我正在尝试构建hello-jni,这是NDK中的示例项目。这是我的环境:AndroidStudio1.4(当前可用的最新稳定版本)NDK版本:r10e操作系统:Windows7Application.mk文件内容:APP_ABI:=all6
我正在努力获取toolJNI4NET工作,以便我可以使用我的C#应用程序中的一些Java代码。作为一个简单的初始测试,我创建了一个简单的Java类库,其中包含一个类Person和一个方法publicStringGetName(){return"NoBody";}。从这里开始,我一直按照JNI下载中提供的示例编辑generateProxies.cmd以创建jar的DLL包装器。我在这方面运气不佳,所以我决定尝试执行相同的操作,但使用示例,特别是名为myJavaDemoCalc的示例。在示例文件夹中执行generateProxies.cmd时会抛出错误。(有需要我会转载这张图)我关注了th
我有一个Fortran格式的Fifp.dll,带有一个简单的voidRESET()函数,并尝试从我的Java代码中调用它。我做了一个简单的java测试类:publicclassTestJni{static{System.loadLibrary("Fifp");}publicnativevoidRESET();}我从中制作了一个.h文件,并编译了它。我还制作了一个桥接文件myBridge.c:#include#include"TestJni.h"externvoidRESET();JNIEXPORTvoidJNICALLJava_TestJni_RESET(JNIEnv*env,jobj
如何在不使用eclipse的情况下调试VisualStudio2003中的JNI代码? 最佳答案 http://www.velocityreviews.com/forums/t152740-jni-debugger.htmlSUMMARY:Basically,theideaisthatyoustartyourJavaprogramunderEclipse,andthentellVCtoattachtotherunningprocesstoo. 关于java-在VisualStudio20
我知道在正常的NDK构建中,C++库被构建并打包到一个apk文件中。但是我怎样才能在Eclipse中自动化它呢?我试过关注http://mhandroid.wordpress.com/2011/01/23/using-eclipse-for-android-cc-development/运行NDK附带的native事件示例,但最终无法正常工作。即使在我通过包含解决了大部分引用错误之后,当我将它作为Android应用程序运行时(插入摩托罗拉手机)也没有任何反应。我已经对此进行了大量研究,但仍然卡住了,所以我现在愿意接受建议。谢谢!(请记住,我在Windows7上使用MinGW/MSys,
我正在创建一个调用java程序的Windows服务程序。这是部分代码,hModule是一个全局变量,在ServiceStart中调用了LoadLibrary,之后调用了invokeJVM。我设法启动了该服务并且它运行良好,但是,每当我停止该服务时,它都会给我一个错误:Windows无法停止本地计算机上的服务错误1067:Windows服务意外终止添加了额外的日志记录后,发现意外终止错误发生的地方是invokeJVM函数的返回。当我检查事件查看器时,它给了我一些BEX错误,谷歌搜索表明这是一个堆栈溢出错误,但我无法确定它的原因,知道为什么吗?HMODULEhModule;VOIDServ
以下是通过JNI从JavaJVM调用的C++代码的摘录:(JNIEnv*pJniEnv,jobject,jstringpDllName){stringdllName(pJniEnv->GetStringUTFChars(pDllName,NULL));//stuffhappensherelikeHINSTANCEloadedDll=LoadLibrary(dllName.c_str());pJniEnv->ReleaseStringUTFChars(pDllName,dllName.c_str());return...;}这在WindowsXP中有效,但在Windows7中崩溃并出现访
我正在从JNI调用我的nativedll的方法。它工作正常,但在我的native代码中的一个地方,我正在调用exit(1)以便native代码停止工作但发生的事情是它也导致退出我的java应用程序。我错过了什么吗?JNI中是否有任何方法可以让我只能终止native代码而不是整个Java应用程序?编辑:基本上我是用native代码加密文件。我希望它在有人从java取消操作时停止加密。如有任何帮助,我们将不胜感激。 最佳答案 JNInative代码和JVM在同一个进程中运行。由于exit关闭进程,它也将结束JVM。杀死在native代码
目录背景正文layoutxmljavaC++java总结一:追问:C++C++总结二:答疑解惑C++画蛇添足视频不显示黑屏最后感叹科技的更新速度,真的程序员都可能会被替代,下一个时代最大的问题应该是劳动力过剩,导致社会性结构改变,一部分人会被社会性抛弃。背景相机拍摄的画面通过localsocket获取,所以C++的代码可以轻易的获取到每一帧视频数据,需要通过JNI让Android显示出来,方法有两种,一种是在Android内创建回调函数使用Bitmap和ImageView进行赋值显示,另一种也就是ChatGPT完成的,Android将surface传递到JNI层内,C++来完成赋值和渲染,后者
假设我有以下Java代码:publicclassTest{publicstaticintfoo(){thrownewRuntimeException();}}以通常的方式加载native库。native库注册并缓存JVM或其他任何内容,然后稍后执行此函数:JNIEnv*sEnv;//initialisedsomewhereproperlyvoidthrowMeARiver(){jclassc=sEnv->FindClass("Test");jmethodIDm=sEnv->GetStaticMethodID(c,"foo","()I");jinti=sEnv->CallStaticIn