我正在尝试使用JNI从C ++调用Java方法。为此,我安装了jdk1.7.0_51
,与jdk1.7.0_51\lib\jvm.lib
相关联,包括jdk1.7.0_51\include
和jdk1.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.dll
和jdk1.7.0_51\jre\bin\Server\jvm.dll
- 结果相同(我不完全确定它有什么区别)。
任何想法&amp;建议将受到高度赞赏。
答案 0 :(得分:8)
使用静态链接
jvm.dll
。必须从它的原始位置加载dll,因为它似乎涉及其他DLL,通过引用找到。PATH
environement变量设置为以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
)