Umstellung VS2008 auf VS2010 „JNI_CreateJavaVM“ auf win7 Access Violation



  • Hallo,

    wir haben ein MFC-Projekt(32bit–Anwendung) von VS2008 auf VS2010 umgestellt.

    Innerhalb dieses Projekts wird folgender Aufruf verwendet, um auf ein Java-Programm zuzugreifen:
    „JNI_CreateJavaVM“

    Bei Installation auf Systemen mit Windows 7 (64bit Version) funktioniert der Aufruf nicht mehr:
    Die Fehlerausgabe im Debug – Fenster lautet:

    „Eine Ausnahme (erste Chance) bei 0x00000000 in rheinlvd.exe: 0xC0000005: Access violation.“

    Unter Windows XP tritt der Fehler nicht auf.
    Unter VS2008 lief die Software unter beiden Windows-Versionen fehlerfrei.
    Kann mir jemand diesbezüglich weiterhelfen?

    Quellcode:

    *.h

    typedef jint (JNICALL *pJNI_CreateJavaVM)(JavaVM**, void **, void *);
    typedef jint (JNICALL *pJNI_GetCreatedJavaVMs)( JavaVM**, jsize, jsize* );
    typedef jint (JNICALL *pJNI_GetDefaultJavaVMInitArgs)(void *);
    pJNI_CreateJavaVM				m_pFunc_CreateJavaVM;
    pJNI_GetCreatedJavaVMs			m_pFunc_GetCreatedJavaVMs;
    pJNI_GetDefaultJavaVMInitArgs		m_pFunc_GetDefJVMInitArgs;
    

    ---------------------------------------------------------------------------

    *.cpp

    jint result = 0; 
    
    HINSTANCE m_JVMlibInstance = LoadLibraryEx(JVMLibName, NULL,   LOAD_WITH_ALTERED_SEARCH_PATH);
    if(!m_JVMlibInstance)
    	return RC_Error_LoadLib;
    
    m_pFunc_CreateJavaVM = (pJNI_CreateJavaVM)GetProcAddress( m_JVMlibInstance, "JNI_CreateJavaVM");
    m_pFunc_GetCreatedJavaVMs = (pJNI_GetCreatedJavaVMs)GetProcAddress( m_JVMlibInstance, "JNI_GetCreatedJavaVMs" );
    m_pFunc_GetDefJVMInitArgs = (pJNI_GetDefaultJavaVMInitArgs) GetProcAddress(m_JVMlibInstance, "JNI_GetDefaultJavaVMInitArgs");
    
    if(!m_pFunc_CreateJavaVM || !m_pFunc_GetCreatedJavaVMs || !m_pFunc_GetDefJVMInitArgs )
    {
    	return RC_Error_ProcAdress;
    }
    
    JavaVMInitArgs vm_args;
    vm_args.version = JNI_VERSION_1_4;
    result = (*m_pFunc_GetDefJVMInitArgs) ( &vm_args );
    
    JavaVMOption options[1];
    options[0].optionString = (char*) classPathOption;
    vm_args.nOptions = 1;
    vm_args.options = options;
    
    jint nSize = 1;
    jint nVms;
    jint nStatus = (*m_pFunc_GetCreatedJavaVMs) ( &m_pJVM, nSize, &nVms );
    
    if(m_pJVM && nVms > 0 && nStatus == 0)
    {
    	jint res = m_pJVM->AttachCurrentThread((void**) &m_pJEnv, &vm_args);
    	if(res==0)
    	{
    		m_bJVMisLoaded = true;
    		return RC_OK;
    	}
    }
    else
    {
    	result = (*m_pFunc_CreateJavaVM) (&m_pJVM, (void**) &m_pJEnv, &vm_args);
    	if(!result && m_pJVM && m_pJEnv) 
    	{
    		return RC_OK;
    	}
    }
    

Anmelden zum Antworten