c++ - JNI_CreateJavaVM() 以退出代码 1 终止

标签 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;
}

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

如有任何想法和建议,我们将不胜感激。

最佳答案

使用静态链接

  1. 从您的项目目录中删除jvm.dll。该 dll 必须从其原始位置加载,因为似乎涉及其他 DLL,通过引用找到。
  2. PATH 环境变量设置为以 JRE jvm.dll 的文件夹开头。并且不要使用 "c:\folder with space in name" 符号(用 双引号 将路径括起来)。只需使用 set path=c:\folder with space in name;%PATH%。这个错误让我之前的尝试变得毫无值(value)。

使用动态链接。

  1. 从您的项目目录中删除jvm.dll。该 dll 必须从其原始位置加载,因为似乎涉及其他 DLL,通过引用找到。
  2. 从项目配置中删除 jvm.lib
  3. 使用 LoadLibrary,使用 jvm.dll 的完整路径(转义“\”或使用“/”)
  4. 对“JNI_CreateJavaVM”使用 GetProcAddress
  5. 确保为函数指针使用正确的 typedef(使用 JNICALL 作为调用约定)

使用上述步骤修补您的代码会使我的 VS2012/Seven64/x86Debug/JDK1.6 项目输出“This code is never reached”(使用 ret == JNI_OK)

关于c++ - JNI_CreateJavaVM() 以退出代码 1 终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21430908/

相关文章:

java - JNI 检测到应用程序错误 : the return type of CallObjectMethodV does not match void android. media.AudioTrack.play()

java - JNI native 接口(interface)和 JavaFX - NoClassDefFoundError

c++ - 如何重载 == 运算符而不使其成为友元函数?

linux - linux共享库中的JNI代码

java - GetByteArrayElements 何时返回 null?

java - 用户按下键时看不到消息

c++ - SFINAE 序列化共享指针失败

c++ - 在 C++ 中导入一个 dll 函数

c++ - 在C++中初始化对象数组

java - 使用maven打包时如何调用SO原生库?