C++ 我可以多次调用JNI_CreateJavaVM吗?
我正在尝试启动两个线程,它们调用“DispFrontEnd”函数 第一个线程结束正常,第二个线程启动jvm失败 tksC++ 我可以多次调用JNI_CreateJavaVM吗?,c++,multithreading,java-native-interface,C++,Multithreading,Java Native Interface,我正在尝试启动两个线程,它们调用“DispFrontEnd”函数 第一个线程结束正常,第二个线程启动jvm失败 tks #包括“jni.h” #包括 #包括“Stdafx.h” //调度线程检查 bool DispatchThreadCreated=FALSE; 如果(DispatchThreadCreated==FALSE) { 处理HDISP线程; hDispThread=(HANDLE)_beginthread(dispatchFrontEnd,0,(void*)dispatchInput
#包括“jni.h”
#包括
#包括“Stdafx.h”
//调度线程检查
bool DispatchThreadCreated=FALSE;
如果(DispatchThreadCreated==FALSE)
{
处理HDISP线程;
hDispThread=(HANDLE)_beginthread(dispatchFrontEnd,0,(void*)dispatchInputs);
如果((长)hDispThread==-1)
{
log.LogError(“线程DispFrontEnd返回**********BG”,(长)hDispThread);
LogError(“errno”,errno);
LogError(“\u doserrno”,\u doserrno”);
}
其他的
{
logloc->LogMethod(“创建调度线程”);
DispatchThreadCreated=TRUE;
//一根线的末端
WaitForSingleObject(hDispThread,无限);
DispatchThreadCreated=FALSE;//01\u 02\u 2010
logloc->LogMethod(“调度线程结束”);
}
}
如果(DispatchThreadCreated==FALSE)
{
处理HDISP3;
logloc->LogMethod(“3:创建调度线程”);
hDispThread3=(句柄)_beginthread(dispatchFrontEnd,0,(void*)dispatchInputs);
如果((长)hDispThread3==-1)
{
log.LogError(“3:Thread DispFrontEnd返回*********BG”,(长)hDispThread3);
LogError(“errno”,errno);
LogError(“\u doserrno”,\u doserrno”);
}
其他的
{
logloc->LogMethod(“3:创建调度线程”);
DispatchThreadCreated=TRUE;
//一根线的末端
WaitForSingleObject(hDispThread3,无限);
DispatchThreadCreated=FALSE;//01\u 02\u 2010
logloc->LogMethod(“3:调度线程结束”);
}
}
void disprentend(void*indArr)
{
JNIEnv*env;
JavaVM*jvm;
env=create_vm(&jvm);//第二次调用时返回null???
}
JNIEnv*创建虚拟机(JavaVM**jvm){
CString-str;
JNIEnv*env;
JavaVMInitArgs vm_args;
JavaVMOption选项;
options.optionString=“-Djava.class.path=C:\\dispatch\\lib\\Run.jar;C:\\dispatch\\classes”;//java源代码的路径
vm_args.version=JNI_version_1_6;//JDK version。这表示版本1.6
vm_args.nOptions=1;
vm_args.options=&options;
vm_args.ignoreunrecogned=0;
int ret=JNI_CreateJavaVM(jvm,(void**)&env和vm_args);
如果(ret<0)
{
env=NULL;
str.Format(“错误!创建JVM(%d)”,ret);//在第二次调用时显示它?
logloc->LogMethod(str);
}
其他的
{
str.Format(“JVM%x创建成功!”,env->GetVersion();
logloc->LogMethod(str);
}
返回环境;
}
您真的需要启动很多JVM吗?你能用jint AttachCurrentThread(JavaVM*vm,JNIEnv**p_env,void*thr_参数)
相反
我只知道一个本机线程不能同时连接两个不同的JVM。请注意WMD不用于格式化代码。请尝试给出一个简单的示例,或者至少给出一段编译的代码。是的,第一个线程结束了,可能JVM在第二个线程启动之前还没有被销毁。。。
#include "jni.h"
#include <process.h>
#include "Stdafx.h"
//DISPATCH Thread Check
bool DispatchThreadCreated = FALSE;
if (DispatchThreadCreated == FALSE)
{
HANDLE hDispThread;
hDispThread = (HANDLE)_beginthread(DispFrontEnd,0,(void *)dispatchInputs);
if ((long)hDispThread == -1)
{
log.LogError("Thread DispFrontEnd Returned********BG ", (long)hDispThread);
log.LogError("errno", errno);
log.LogError("_doserrno", _doserrno);
}
else
{
logloc->LogMethod("Dispatch Thread CREATED");
DispatchThreadCreated= TRUE;
//Espera que a thread termine
WaitForSingleObject( hDispThread, INFINITE );
DispatchThreadCreated= FALSE; // 01_02_2010
logloc->LogMethod("Dispatch Thread ENDED");
}
}
if (DispatchThreadCreated == FALSE)
{
HANDLE hDispThread3;
logloc->LogMethod("3 : Dispatch Thread CREATED");
hDispThread3 = (HANDLE)_beginthread(DispFrontEnd,0,(void *)dispatchInputs);
if ((long)hDispThread3 == -1)
{
log.LogError("3 : Thread DispFrontEnd Returned********BG ", (long)hDispThread3);
log.LogError("errno", errno);
log.LogError("_doserrno", _doserrno);
}
else
{
logloc->LogMethod("3 : Dispatch Thread CREATED");
DispatchThreadCreated= TRUE;
//Espera que a thread termine
WaitForSingleObject( hDispThread3, INFINITE );
DispatchThreadCreated= FALSE; // 01_02_2010
logloc->LogMethod("3 : Dispatch Thread ENDED");
}
}
void DispFrontEnd(void * indArr)
{
JNIEnv *env;
JavaVM *jvm;
env = create_vm(&jvm); // return null on second call ???
}
JNIEnv* create_vm(JavaVM ** jvm) {
CString str;
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options;
options.optionString = "-Djava.class.path=C:\\dispatch\\lib\\Run.jar;C:\\dispatch\\classes"; //Path to the java source code
vm_args.version = JNI_VERSION_1_6; //JDK version. This indicates version 1.6
vm_args.nOptions = 1;
vm_args.options = &options;
vm_args.ignoreUnrecognized = 0;
int ret = JNI_CreateJavaVM(jvm, (void**)&env, &vm_args);
if(ret < 0)
{
env = NULL;
str.Format("ERROR! create JVM (%d)",ret); // show this on second call!! ?
logloc->LogMethod( str );
}
else
{
str.Format("JVM %x created Success!",env->GetVersion());
logloc->LogMethod( str );
}
return env;
}