JNI_CreateJavaVM()以退出代码1终止

Con*_*tin 7 c++ java-native-interface jnienv

我正在尝试使用JNI从C++调用Java方法.要做到这一点,我已经安装jdk1.7.0_51,链接jdk1.7.0_51\lib\jvm.lib,包括jdk1.7.0_51\includejdk1.7.0_51\include\win32.在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;
}
Run Code Online (Sandbox Code Playgroud)

操作系统: Windows 7(x64)

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

Java VM: jdk1.7.0_51,i586(在我看来应该没问题,因为我正在编译x86 - 否则与jvm.lib的链接将无效)

我已经尝试过使用两者:jdk1.7.0_51\jre\bin\client\jvm.dll以及jdk1.7.0_51\jre\bin\Server\jvm.dll- 同样的结果(我不完全确定它的区别是什么).

任何想法和建议将受到高度赞赏.

man*_*ell 8

使用静态链接

  1. jvm.dll从项目目录中删除.必须从它的原始位置加载dll,因为它似乎涉及其他DLL,由引用找到.
  2. PATHenvironement变量设置为以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/Seven64/x86Debug/JDK1.6项目输出"此代码永远不会到达"(使用ret == JNI_OK)