我正在尝试使用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).
#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
- 同样的结果(我不完全确定它的区别是什么).
任何想法和建议将受到高度赞赏.
使用静态链接
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
)