Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以多次调用JNI_CreateJavaVM吗?_C++_Multithreading_Java Native Interface - Fatal编程技术网

C++ 我可以多次调用JNI_CreateJavaVM吗?

C++ 我可以多次调用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

我正在尝试启动两个线程,它们调用“DispFrontEnd”函数 第一个线程结束正常,第二个线程启动jvm失败

tks

#包括“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;
 }