Excepción 0xC0000005 de JNI_CreateJavaVM(jvm.dll)
visual-studio-2015 java-native-interface (2)
Estoy inicializando la máquina virtual Java utilizando el siguiente código C ++.
JNI_CreateJavaVM
lanza una excepción
0xC0000005
pero tiene éxito si la ignoro.
''Jni.exe'' (Win32): cargado ''C: / Tools / Java / Jdk8.77x86 / jre / bin / zip.dll''. No se puede encontrar o abrir el archivo PDB.
Excepción lanzada en 0x02900282 en Jni.exe: 0xC0000005: Ubicación de lectura de infracción de acceso 0x00000000.
''Jni.exe'' (Win32): cargado ''C: / Windows / SysWOW64 / shell32.dll''. No se puede encontrar o abrir el archivo PDB.
¿Me estoy olvidando de configurar o hacer algo o es este comportamiento ''normal''?
#include <array>
#include "jni.h"
int main( int argc, char const* args[])
{
JavaVM* jvm;
JNIEnv* env;
std::array<JavaVMOption,1> options;
options[0].optionString = "-Djava.class.path=C:/Users/Thomas/Documents/Visual Studio 2015/Projects/Jni/x64/Debug";
options[0].extraInfo = nullptr;
JavaVMInitArgs vm_args;
vm_args.version = JNI_VERSION_1_8;
vm_args.options = options.data();
vm_args.nOptions = options.size();
vm_args.ignoreUnrecognized = false;
auto rc = JNI_CreateJavaVM( &jvm, reinterpret_cast<void**>(&env), &vm_args );
if( rc == JNI_OK )
{
jvm->DestroyJavaVM();
}
}
Esto sucede tanto para Release y Debug como para las compilaciones x86 y x64.
Esto es normal, como dijo @apangin. Si desea desactivar todas las excepciones 0xC0000005 en VisualStudio (2017), puede hacerlo:
- Configuración de excepción: Ctrl + Alt + E
- Eliminar marca de: "0xc0000005 Infracción de acceso" en Excepciones Win32
JVM utiliza activamente las señales del sistema operativo (o excepciones en la terminología de Windows) para sus propios fines:
- para comprobaciones implícitas de puntero nulo y comprobaciones de desbordamiento de pila;
- para encuestas de punto seguro;
- para barreras de memoria remota;
- etc.
SEGV (o excepción 0xC0000005) también se genera intencionalmente en el inicio de JVM para verificar ciertas características de CPU / OS. Algunos sistemas operativos o hipervisores tenían un error que los registros AVX no se restauran después del procesamiento de la señal. Por lo tanto, JVM necesita verificar si este es el caso (la fuente) . Por lo tanto, genera una excepción al escribir en la dirección cero y luego la maneja.
Esto es lo que sucede en tu caso. Y sí, es normal.