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; } }