从Win32/MFC应用程序中启用时无法使用JNI

Unable to use JNI when enabled from within Win32/MFC application

本文关键字:JNI 启用 Win32 MFC 应用程序      更新时间:2023-10-16

我正试图利用Java Native Interface在Visual C++应用程序中使用Java函数,但运气不佳。

我在CDialog中的按钮点击处理程序函数中调用代码,我甚至试图创建一个Java VM实例,我的应用程序抛出了一个访问违规异常:"MyApp.exe中0x0F7D260A(mfc120u.dll)处的未处理异常:0xC0000005:读取位置0xFEEEF26的访问违规。"然而,当我将代码放入一个只包含main()函数的框架C++应用程序中时,一切都很好。

据我所知,我已经在Visual Studio 2013中正确地设置了我的项目。我将包含JDK文件夹中include目录中的jni.h,并链接JDKlib文件夹中包含的jvm.lib。我也在使用JDK 1.8.0_91。

就其价值而言,以下是代码:

JNIEnv *env = NULL;
JavaVM *jvm = NULL;
jint res;
  // Initialization arguments
JavaVMInitArgs vm_args;
memset(&vm_args, 0, sizeof(vm_args));
JavaVMOption options[3];
memset(&options, 0, sizeof(options));
options[0].optionString = "-Djava.class.path=C:/";
options[1].optionString = "-Xms128m"; // 128MB initial heap size
options[2].optionString = "-Xmx1g"; // 1GB maximum heap size
vm_args.version = JNI_VERSION_1_8;
vm_args.nOptions = 3;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;
jint status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

任何帮助都将不胜感激

最终,我明白了这一点。显然,JNI在启动时抛出异常是为了验证它运行的环境。请参阅JNI_CreateJavaVM(jvm.dll)中的异常0xC0000005。

当我在visualstudio中禁用Win32异常中的特定异常时,一切都很好。