Jni_createjavm()用退出代码1终止

JNI_CreateJavaVM() terminates with exit code 1

本文关键字:退出 代码 终止 createjavm Jni      更新时间:2023-10-16

我试图使用JNI从C 调用Java方法。为此,我已经安装了jdk1.7.0_51,链接到jdk1.7.0_51libjvm.lib,包括jdk1.7.0_51includejdk1.7.0_51includewin32。使用Visual Studio 2012中的以下代码,我尝试创建一个Java VM对象 - 但是该功能始终使用退出代码1终止我的应用程序(该函数不返回1:我的程序完全终止并发送退出代码1)。<<<<<<<<<<<<

#include <iostream>
#include "jni.h"
int main(int argc, char*argv[]){
  JNIEnv* env = nullptr;
  JavaVM* jvm = nullptr;
  JavaVMInitArgs vm_args;
  JavaVMOption options[2];
  options[0].optionString = "-Djava.class.path=.";
  options[1].optionString = "-DXcheck:jni:pedantic";  
  vm_args.version = JNI_VERSION_1_6;
  vm_args.nOptions = 2;
  vm_args.options = options;
  vm_args.ignoreUnrecognized = JNI_TRUE; // remove unrecognized options
  int ret = JNI_CreateJavaVM(&jvm, (void**) &env, &vm_args);
  std::cout << "This code is never reached" << std::endl;
  return 0;
}

OS: Windows 7(x64)

编译器: Visual Studio 2012(x86/win32项目)

Java VM: JDK1.7.0_51,i586(我认为应该可以,因为我正在为X86编译X86-否则与JVm.lib链接无效)

我已经尝试使用两者: jdk1.7.0_51jrebinclientjvm.dlljdk1.7.0_51jrebinServerjvm.dll-有相同的结果(我不完全确定有什么区别)。

任何想法&amp;建议将不胜感激。

使用静态链接

  1. 从项目目录中删除jvm.dll。DLL必须从原始位置加载,因为似乎涉及其他DLL,参考文献。
  2. PATH环境变量设置为从JRE jvm.dll的文件夹开始。并且不要使用"c:folder with space in name"表示法(围绕double quotes的路径)。只需使用set path=c:folder with space in name;%PATH%即可。这个错误使我以前的尝试一文不值。

使用动态链接。

  1. 从项目目录中删除jvm.dll。DLL必须从原始位置加载,因为似乎涉及其他DLL,参考文献。
  2. 从项目配置中删除jvm.lib
  3. 使用LoadLibrary,带有JVm.dll的完整路径(逃脱''或使用'/')
  4. 使用GetProcAddress作为" JNI_CreateJavaVM"
  5. 确保将适当的typedef用于功能指针(使用JNICALL作为呼叫约定)

使用上述步骤修补代码使我的VS2012/SENWEN64/X86DEBUG/JDK1.6项目要输出"从未达到此代码"(带有ret == JNI_OK

相关文章: