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

Posted 跨链技术践行者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java - 来自JNI_CreateJavaVM(jvm.dll)的异常0xC0000005相关的知识,希望对你有一定的参考价值。

我正在使用以下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出于自身目的主动使用OS信号(或Windows术语中的异常):

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

  • SEGV(或异常0xC0000005)也有意在JVM启动时生成,以验证某些CPU / OS功能。某些OS或系统管理程序存在一个错误,即在信号处理后AVX寄存器无法恢复。因此,JVM需要检查是否为(the source)。因此,它通过写入零地址来生成异常,然后对其进行处理。

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

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

以上是关于java - 来自JNI_CreateJavaVM(jvm.dll)的异常0xC0000005的主要内容,如果未能解决你的问题,请参考以下文章

C 语言调用 JNI_CreateJavaVM

C 语言调用 JNI_CreateJavaVM

C 语言调用 JNI_CreateJavaVM

引用了未解析的外部符号 __imp__JNI_CreateJavaVM@12

Eclipse:JVM 共享库不包含 JNI_CreateJavaVM 符号

架构 x86_64 的未定义符号:JNI_CreateJavaVM OS-X Xcode