JNI_CreateJavaVM()以退出代码1终止

时间:2014-01-29 12:17:36

标签: 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)。 / p>

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

操作系统: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.dlljdk1.7.0_51\jre\bin\Server\jvm.dll - 结果相同(我不完全确定它有什么区别)。

任何想法&amp;建议将受到高度赞赏。

1 个答案:

答案 0 :(得分:8)

使用静态链接

  1. 从项目目录中删除jvm.dll。必须从它的原始位置加载dll,因为它似乎涉及其他DLL,通过引用找到。
  2. PATH environement变量设置为以JRE jvm.dll的文件夹开头。并且不要使用"c:\folder with space in name"表示法(用double quotes围绕路径)。只需使用set path=c:\folder with space in name;%PATH%即可。这个错误使我以前的尝试毫无价值。
  3. 使用动态链接。

    1. 从项目目录中删除jvm.dll。必须从它的原始位置加载dll,因为它似乎涉及其他DLL,通过引用找到。
    2. 从项目配置中删除jvm.lib
    3. 使用LoadLibrary,使用jvm.dll的完整路径(转义'\'或使用'/')
    4. 使用GetProcAddress代替“JNI_CreateJavaVM
    5. 确保为函数指针使用正确的typedef(使用JNICALL作为调用约定)
    6. 使用上述步骤修补代码使我的VS2012 / Seven64 / x86Debug / JDK1.6项目输出“此代码永远不会到达”(使用ret == JNI_OK