在单个线程中调用多次JNI

时间:2014-05-23 12:56:37

标签: java c++ java-native-interface

我需要在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... `

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

1 个答案:

答案 0 :(得分:1)

我想您可能会尝试完成以下内容

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

这段代码将从JVM获取env :(这样,每个实例都有env的本地副本和jvm的全局副本)

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

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