我需要在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参数,然后重新创建它。
答案 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