2010-02-01 2 views
0

I'm Попытка запускать две темы, ведьма вызывает функцию «DispFrontEnd» Первый поток закончился ОК, второй не удалось запустить jvm .. ??Могу ли я позвонить несколько раз JNI_CreateJavaVM?

ТКС

#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; 
} 
+0

Обратите внимание, что WMD не использует

 для форматированного кода. –
                        
                            
                                
                            
                        
                    

+0

Попробуйте представить минимальный пример или, по крайней мере, дать кусок кода, который компилируется. – JesperE

ответ

0

Вы действительно должны начать много JVM? Не могли бы вы использовать
jint AttachCurrentThread (JavaVM * vm, JNIEnv ** p_env, void * thr_args);
вместо этого?

Единственное, что я знаю, это родной поток, который не может одновременно подключать два разных JVM.

+0

да первая нить закончилась и, возможно, JVM еще не была уничтожена до начала второго потока ... – Reversed

+0

Спасибо за вашу помощь AttachCurrentThread() работал! – Reversed

Смежные вопросы