gpt4 book ai didi

java - 在单个 Tread 中调用多次 JNI

转载 作者:行者123 更新时间:2023-11-28 06:51:50 24 4
gpt4 key购买 nike

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

最佳答案

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

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

这段代码将从 JVM 获取 env:(这样放置,每个实例都有 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

关于java - 在单个 Tread 中调用多次 JNI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23829896/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com