JNI_CreateJavaVM() terminates with exit code 1

c++, java-native-interface, jnienv

Solution

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 JRE `jvm.dll`. And don't use the `"c:\folder with space in name"` notation (that is surrounding the path with `double quotes`). Just use `set 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 (use `JNICALL` 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`)

Problem

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.

Original source