java visual-studio-2015 jvm java-native-interface

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:

  1. Configuración de excepción: Ctrl + Alt + E
  2. 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.