草庐IT

android - 无法在任意上下文中获取 JNIEnv* 值

我对NDK有疑问。在我的JNI_OnLoad方法中,我缓存了JavaVm指针、调用该方法的类以及我稍后使用的方法ID:JNIEXPORTjintJNICALLJNI_OnLoad(JavaVM*jvm,void*reserved){JNIEnv*env;cachedJVM=jvm;if((*jvm)->GetEnv(jvm,(void**)&env,JNI_VERSION_1_6)){LOG_ERROR("CouldnotgetJNIEnv*");returnJNI_ERR;}javaClass=(*env)->FindClass(env,"org/test/opensl/AudioP

java - 类型 'jint' 无法解析,以及 JNIEnv、jclass

尝试使用jnic代码构建一个简单的helloWorldandroid/java应用程序。我在Windows7上使用EclipseIndigo。在非空格路径中安装了ndkr8,最终使用ndk-build.cmd构建了c库。但是javah生成的头文件有Unresolved错误,无法解析类型“jint”无法解析类型“JNIEnv”无法解析类型“jclass”昨天没有看到jni.h包含,但今天早上重新启动后,该错误消失了。我也有一个UnresolvedJNIEXPORT和JNICALL错误,但#defining它们似乎已经解决了这个问题。卡在上面的最后3个。已经在谷歌和StackOverflo

java - 类型 'jint' 无法解析,以及 JNIEnv、jclass

尝试使用jnic代码构建一个简单的helloWorldandroid/java应用程序。我在Windows7上使用EclipseIndigo。在非空格路径中安装了ndkr8,最终使用ndk-build.cmd构建了c库。但是javah生成的头文件有Unresolved错误,无法解析类型“jint”无法解析类型“JNIEnv”无法解析类型“jclass”昨天没有看到jni.h包含,但今天早上重新启动后,该错误消失了。我也有一个UnresolvedJNIEXPORT和JNICALL错误,但#defining它们似乎已经解决了这个问题。卡在上面的最后3个。已经在谷歌和StackOverflo

java - 异步调用如何获取JNI接口(interface)指针(JNIEnv *)

了解到JNI接口(interface)指针(JNIEnv*)只在当前线程中有效。假设我在native方法中启动了一个新线程;它如何将事件异步发送到Java方法?因为这个新线程不能引用(JNIEnv*)。为(JNIEnv*)存储一个全局变量显然不起作用? 最佳答案 您可以通过JNIEnv->GetJavaVM获得指向JVM(JavaVM*)的指针。.您可以安全地将该指针存储为全局变量。稍后,在新线程中,您可以使用AttachCurrentThread将新线程附加到JVM,如果你是用C/C++创建的,或者只是GetEnv如果你在java

java - 异步调用如何获取JNI接口(interface)指针(JNIEnv *)

了解到JNI接口(interface)指针(JNIEnv*)只在当前线程中有效。假设我在native方法中启动了一个新线程;它如何将事件异步发送到Java方法?因为这个新线程不能引用(JNIEnv*)。为(JNIEnv*)存储一个全局变量显然不起作用? 最佳答案 您可以通过JNIEnv->GetJavaVM获得指向JVM(JavaVM*)的指针。.您可以安全地将该指针存储为全局变量。稍后,在新线程中,您可以使用AttachCurrentThread将新线程附加到JVM,如果你是用C/C++创建的,或者只是GetEnv如果你在java

android - 保存 JNIEnv* 的最佳方法是什么?

我有一个使用JNI的Android项目。在实现监听器类的CPP文件中,有一个回调x()。当调用x()函数时,我想调用java类中的另一个函数。但是,为了调用该java函数,我需要访问JNIEnv*。我知道在回调的同一个cpp文件中,有一个函数:staticjbooleaninit(JNIEnv*env,jobjectobj){...}调用init(..)时,我是否应该将JNIEnv*作为成员变量保存在cpp文件中?并在回调发生时使用它?抱歉,我是JNI的初学者。 最佳答案 缓存JNIEnv*不是一个特别好的主意,因为您不能在多个线程

java - 获取有效的 JNIEnv 指针

我有一个C++dll,我想通过将函数导出到C#来在Unity中使用它。Unity项目在Android设备上运行,C++代码使用java。要初始化C++,我需要先调用以下函数:voidapi_initialize(JNIEnv*env,jobject*app_context,jobject*class_loader){JavaVM*vm=nullptr;env->GetJavaVM(&vm);if(!vm){return;}//Dootherproprietarythings}在Unity中,我有以下导出的Dll函数[DllImport(dllName)]privatestaticext

java - 错误 : base operand of ‘->’ has non-pointer type ‘JNIEnv’

#include#includeJNIEnv*create_vm(){JavaVM*jvm;JNIEnv*env;JavaVMInitArgsargs;JavaVMOptionoptions[1];/*ThereisanewJNI_VERSION_1_4,butitdoesn'taddanythingforthepurposesofourexample.*/args.version=JNI_VERSION_1_2;args.nOptions=1;options[0].optionString="-Djava.class.path=/home/test/workspace/pankajs