8

我正在尝试使用 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;
}

操作系统: 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- 具有相同的结果(但我不完全确定有什么区别)。

任何想法和建议将不胜感激。

4

1 回答 1

9

使用静态链接

  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. 用于GetProcAddressJNI_CreateJavaVM
  5. 确保typedef对函数指针使用正确的(JNICALL用作调用约定)

使用上述步骤修补代码会使我的 VS2012/Seven64/x86Debug/JDK1.6 项目输出“此代码永远无法到达”(使用 ret == JNI_OK

于 2014-01-29T18:18:40.657 回答