来自JNI_CreateJavaVM(jvm.dll)的exception0xC0000005

我正在使用以下C ++代码初始化Java VM。 JNI_CreateJavaVM会抛出一个0xC0000005exception,但如果我忽略它就会成功。

‘Jni.exe’(Win32):加载’C:\ Tools \ Java \ Jdk8.77×86 \ jre \ bin \ zip.dll’。 无法找到或打开PDB文件。

Jni.exe中0x02900282处抛出exception:0xC0000005:访问冲突读取位置0x00000000。

‘Jni.exe’(Win32):加载’C:\ Windows \ SysWOW64 \ shell32.dll’。 无法找到或打开PDB文件。

我忘了设置或做某事还是这种“正常”行为?

 #include  #include "jni.h" int main( int argc, char const* args[]) { JavaVM* jvm; JNIEnv* env; std::array 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(&env), &vm_args ); if( rc == JNI_OK ) { jvm->DestroyJavaVM(); } } 

发布和调试以及x86和x64版本都会发生这种情况。

JVM主动使用OS信号(或Windows术语中的例外)用于其自身目的:

  • 用于隐式空指针检查和堆栈溢出检查;
  • 用于安全点轮询;
  • 用于远程记忆障碍;
  • 等等

在JVM启动时也会有意生成SEGV(或exception0xC0000005)以validation某些CPU / OSfunction。 某些操作系统或管理程序有一个错误,即AVX寄存器在信号处理后没有恢复。 因此,JVM需要检查是否是这种情况(源) 。 因此它通过写入零地址然后处理它来生成exception。

这就是你的情况。 是的,这是正常的。