JNI_CreateJavaVM()以退出代码1终止

 小呆74588 发布于 2023-01-30 16:29

我正在尝试使用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 
#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,由引用找到.

      PATHenvironement变量设置为以JRE的文件夹开头jvm.dll.并且不要使用"c:\folder with space in name"符号(即围绕路径double quotes).只是用set path=c:\folder with space in name;%PATH%.这个错误使我以前的尝试毫无价值.

    使用动态链接.

      jvm.dll从项目目录中删除.必须从它的原始位置加载dll,因为它似乎涉及其他DLL,由引用找到.

      jvm.lib从项目配置中删除

      使用LoadLibrary,带有jvm.dll的完整路径(转义'\'或使用'/')

      使用GetProcAddress了" JNI_CreateJavaVM"

      确保使用适当typedef的函数指针(JNICALL用作调用约定)

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

    2023-01-30 16:33 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有