使用JNI启动JVM Builder C ++

时间:2014-08-28 13:53:10

标签: java jvm java-native-interface c++builder

在这篇文章中How to use JNI to start JVM in builder C++ application我将jvm.lib从Coff转换为Omf。我用它来链接JNI_CreateJavaVM()函数。但它崩溃了。

我使用另一个代码从Builder C ++应用程序启动JVM。当我加载jvm.dll。这行得通!!当我在java目录中加载jvm时创建JVM,但是当我在另一个目录中复制此文件(jvm.dll)并从该目录中调用它时,不会创建JVM。可以解释为什么我不能使用jvm.dll的副本创建我的JVM?

这是我的代码:

JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options;
memset(&vm_args, 0, sizeof(vm_args));

options.optionString = "-Djava.class.path=.;tika-app-1.5.jar;";
jint ii = GetVersion();

vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = &options;
vm_args.ignoreUnrecognized = 0;
//String strPath = "C:\\Users\\mhechkel\\Documents\\RAD Studio\\Projects\\TestJVM\\Win32\\Debug\\jvm.dll";  
// when i copy jvm.dll in my application folder: It dosn't work!!!
String strPath = "C:\\Program Files (x86)\\Java\\jdk1.7.0_65\\jre\\bin\\server\\jvm.dll";

HMODULE jvm_dll = LoadLibrary(strPath.c_str()); //here it work fine!!

/// You might check the GetLastError() here after the LoadLibrary()
if(jvm_dll == NULL) 
{    
    Label1->Caption = "can't load dll"; 
}

 JNI_CreateJavaVM_ptr = (JNI_CreateJavaVM_func)GetProcAddress(jvm_dll, "JNI_CreateJavaVM");

 /// You might check the GetLastError() here
 if(JNI_CreateJavaVM_ptr == NULL)
 {
      Label1->Caption = "can't load function";
 }

 int ret = JNI_CreateJavaVM_ptr(jvm, (void**)&env, &vm_args);
 if(ret < 0)
 {
    Label1->Caption = "Unable to Launch JVM\n";
 }
 return env;

1 个答案:

答案 0 :(得分:0)

您需要完整的JRE才能创建Java VM 如果在相对于jvm.dll路径的位置找不到匹配的JRE,JVM将无法启动。

在Windows上,您可以使用_ALT_JAVA_HOME_DIR环境变量覆盖JVM查找JRE的路径,尽管这是HotSpot内部选项,但不保证可以正常工作。