2010-02-01 9 views
0

두 개의 스레드 마녀가 "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을 시작해야합니까 TKS? 사용할 수 있습니까?
jint AttachCurrentThread (JavaVM * vm, JNIEnv ** p_env, void * thr_args);
대신에?

내가 아는 유일한 것은 원시 스레드가 동시에 두 개의 다른 JVM을 연결할 수 없다는 것입니다.

+0

예 첫 번째 스레드가 종료되었고 두 번째 스레드가 시작되기 전에 JVM이 아직 파괴되지 않았습니다 ... – Reversed

+0

AttachCurrentThread()가 도움을 주셔서 감사합니다! – Reversed

관련 문제