问题
I'm trying to call a Java method from C++ using JNI. To do that I've installed jdk1.7.0_51
, linking against jdk1.7.0_51\lib\jvm.lib
, including jdk1.7.0_51\include
and jdk1.7.0_51\include\win32
. using the following code in Visual Studio 2012 I tried to create a Java vm object - but the function always terminates my application with exit code 1 (the function doesn't return 1: my program terminates completly and sends the exit code 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;
}
OS: Windows 7 (x64)
Compiler: Visual Studio 2012 (x86/Win32 Project)
Java VM: jdk1.7.0_51, i586 (should be ok in my opinion, because I'm compiling for x86 - otherwise linkage with jvm.lib wouldn't work)
I've already tried to using both: jdk1.7.0_51\jre\bin\client\jvm.dll
as well as jdk1.7.0_51\jre\bin\Server\jvm.dll
- with the same result (I'm not entirely sure what the difference is though).
Any ideas & suggestions would be highly appreciated.
回答1:
Using static linking
- remove the
jvm.dll
from your project directories. The dll must be loaded from it's original location, as it seems that other DLLs are involved, found by references. - Set the
PATH
environement variable to start with the folder of a JREjvm.dll
. And don't use the"c:\folder with space in name"
notation (that is surrounding the path withdouble quotes
). Just useset path=c:\folder with space in name;%PATH%
. That mistake made my previous attempts worthless.
Using dynamic linking.
- remove the
jvm.dll
from your project directories. The dll must be loaded from it's original location, as it seems that other DLLs are involved, found by references. - Drop
jvm.lib
from your project configuration - Use
LoadLibrary
, with the full path for jvm.dll (escape '\' or use '/') - Use
GetProcAddress
for "JNI_CreateJavaVM
" - Make sure to use a proper
typedef
for the function pointer (useJNICALL
as calling convention)
Patching your code with above steps makes my VS2012/Seven64/x86Debug/JDK1.6 project to output "This code is never reached" (with ret == JNI_OK
)
来源:https://stackoverflow.com/questions/21430908/jni-createjavavm-terminates-with-exit-code-1