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