单线程调用多时间JNI 我需要用C++中的JNI调用jar中的一些方法,但是在同一个类的不同实例中我需要调用它很多次。 我的JNI是这样的 JavaVM *jvm; /* denotes a Java VM */ JNIEnv *env; /* pointer to native method interface */ JavaVMInitArgs vm_args; /* JDK/JRE 6 VM initialization arguments */ jmethodID Sim_constr = NULL; jmethodID Read_XML = NULL; jmethodID configure = NULL; jmethodID initial = NULL; jmethodID results = NULL; jint step = 60; JavaVMOption* options = new JavaVMOption[1]; options[0].optionString = "-Djava.class.path=<My jar>"; vm_args.version = JNI_VERSION_1_8; vm_args.nOptions = 1; vm_args.options = options; vm_args.ignoreUnrecognized = JNI_TRUE; /* load and initialize a Java VM, return a JNI interface * pointer in env */` long status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); if (status == JNI_ERR){ exit(10); } //Some Java method Calls... ` JavaVM*jvm;/*表示Java虚拟机*/ JNIEnv*env;/*指向本机方法接口的指针*/ JavaVMInitArgs vm_args;/*JDK/JRE 6虚拟机初始化参数*/ jmethodID Sim_constr=NULL; jmethodID Read_XML=NULL; jmethodideconfigure=NULL; jmethodide initial=NULL; jmethodID results=NULL; jint阶跃=60; JavaVMOption*options=新的JavaVMOption[1]; 选项[0]。选项字符串=“-Djava.class.path=”; vm_args.version=JNI_version_1_8; vm_args.nOptions=1; vm_args.options=选项; vm_args.ignoreunrecogned=JNI_TRUE; /*加载并初始化JavaVM,返回JNI接口 *环境中的指针*/` long status=JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args); 如果(状态==JNI_ERR){ 出口(10); } //一些Java方法调用`

单线程调用多时间JNI 我需要用C++中的JNI调用jar中的一些方法,但是在同一个类的不同实例中我需要调用它很多次。 我的JNI是这样的 JavaVM *jvm; /* denotes a Java VM */ JNIEnv *env; /* pointer to native method interface */ JavaVMInitArgs vm_args; /* JDK/JRE 6 VM initialization arguments */ jmethodID Sim_constr = NULL; jmethodID Read_XML = NULL; jmethodID configure = NULL; jmethodID initial = NULL; jmethodID results = NULL; jint step = 60; JavaVMOption* options = new JavaVMOption[1]; options[0].optionString = "-Djava.class.path=<My jar>"; vm_args.version = JNI_VERSION_1_8; vm_args.nOptions = 1; vm_args.options = options; vm_args.ignoreUnrecognized = JNI_TRUE; /* load and initialize a Java VM, return a JNI interface * pointer in env */` long status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); if (status == JNI_ERR){ exit(10); } //Some Java method Calls... ` JavaVM*jvm;/*表示Java虚拟机*/ JNIEnv*env;/*指向本机方法接口的指针*/ JavaVMInitArgs vm_args;/*JDK/JRE 6虚拟机初始化参数*/ jmethodID Sim_constr=NULL; jmethodID Read_XML=NULL; jmethodideconfigure=NULL; jmethodide initial=NULL; jmethodID results=NULL; jint阶跃=60; JavaVMOption*options=新的JavaVMOption[1]; 选项[0]。选项字符串=“-Djava.class.path=”; vm_args.version=JNI_version_1_8; vm_args.nOptions=1; vm_args.options=选项; vm_args.ignoreunrecogned=JNI_TRUE; /*加载并初始化JavaVM,返回JNI接口 *环境中的指针*/` long status=JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args); 如果(状态==JNI_ERR){ 出口(10); } //一些Java方法调用`,java,c++,java-native-interface,Java,C++,Java Native Interface,我需要设置一次JNI,然后只调用3-4方法,或者完全终止/删除JNI参数,然后再次创建它。我想您可以尝试完成以下操作 使用CreateJavaVM方法创建JVM后,JVM对于类的所有实例都保持全局,对于类的每个实例,环境变量(env)都应该是本地的。而且每个实例的env var必须用于多次使用不同的实例调用您的方法 这个代码段将从JVM中获取env:(将其放置为每个实例都有env的本地副本和JVM的全局副本) 创建实例后,必须将这些环境附加到当前线程(即当前实例) 我很难理解你的目标。您只是在剥

我需要设置一次JNI,然后只调用3-4方法,或者完全终止/删除JNI参数,然后再次创建它。

我想您可以尝试完成以下操作

使用CreateJavaVM方法创建JVM后,JVM对于类的所有实例都保持全局,对于类的每个实例,环境变量(env)都应该是本地的。而且每个实例的env var必须用于多次使用不同的实例调用您的方法

这个代码段将从JVM中获取env:(将其放置为每个实例都有env的本地副本和JVM的全局副本)

创建实例后,必须将这些环境附加到当前线程(即当前实例)


我很难理解你的目标。您只是在剥离新的JVM吗?本机线程在哪里?它们如何相互作用?我只需要通过一个类的不同实例多次调用C++项目中的java方法(使用JNI)。例如,MyClass obj1,obj2.Call jar method with obj1…很好,Call method with obj2…不可能,因为在第一个实例中已经创建了一个JVM。我通过创建一个JNI env并通过全局环境变量将此指针传递给任何类来实现。因此,我只创建一次JVM,然后我就可以在每个实例中使用所有函数;)因此,在所有实例中使用相同的JNI env变量?是的,正是这样,我可以在任何地方使用Java虚拟机方法,不建议将JNI env变量用作所有线程的全局指针,请参阅。这就是为什么我建议对每个正在使用的实例使用全局JVM和本地JNI env。我同意,但我只有一个线程。我所做的就是在一个类中启动JVM,并在另一个类中多次使用它。尽管如果有任何问题,我会记住您的解决方案。
JNIEnv * g_env;
 int getEnvStat = jvm->GetEnv((void **)&g_env, JNI_VERSION_1_8);

 if (getEnvStat == JNI_EDETACHED) {
  printf("GetEnv: not attached");
  getEnvStat = g_vm->AttachCurrentThread((void **) &g_env, NULL);
  if ( getEnvStat != 0) {
   printf("Failed to attach");
  }
 } else if (getEnvStat == JNI_OK) {
 } else if (getEnvStat == JNI_EVERSION) {
  printf("GetEnv: version not supported");
 }
//use the g_env variable for java method calls
//Rememeber to use this code as a local copy for each instance