java - 来自 JNI_CreateJavaVM (jvm.dll) 的异常 0xC0000005

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

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

'Jni.exe' (Win32): Loaded 'C:\Tools\Java\Jdk8.77x86\jre\bin\zip.dll'. Cannot find or open the PDB file.

Exception thrown at 0x02900282 in Jni.exe: 0xC0000005: Access violation reading location 0x00000000.

'Jni.exe' (Win32): Loaded 'C:\Windows\SysWOW64\shell32.dll'. Cannot find or open the PDB file.

我是不是忘记设置或做某事,或者这是“正常”行为?

#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();        
    }
}

对于 Release 和 Debug 以及 x86 和 x64 构建都会发生这种情况。

最佳答案

JVM 出于自身目的积极使用操作系统信号(或 Windows 术语中的异常):

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

SEGV(或异常 0xC0000005)也是在 JVM 启动时有意生成的,以验证某些 CPU/OS 功能。一些操作系统或管理程序有一个错误,即 AVX 寄存器在信号处理后没有恢复。因此,JVM 需要检查是否是这种情况(the source) .所以它通过写入零地址产生异常,然后处理它。

这就是您的情况。是的,这很正常。

关于java - 来自 JNI_CreateJavaVM (jvm.dll) 的异常 0xC0000005,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39561180/

相关文章:

java - 如何使用android studio在java中获取这个数组的每个元素

java - 将实例分配给上层类的实例

c# - Visual Studio 2015/C# 6/Roslyn 无法编译 PCL 项目中的 XML 注释

linux - 如何确定 Linux 上多进程的 JVM 内存占用

java - 在java中从文件夹ID和父ID创建文件夹

java - GRPC Java - 防止内存泄漏

源代码中的java.lang.nullpointerException

xaml - Visual Studio 2015 XAML 编辑器文本颜色

typescript - 如何启用作为自托管网页的控制台或 Windows 服务的 Visual Studio 项目的 TypeScript 选项卡

JVM 8 更新后 Java Sound 显着变慢