2012-07-09 94 views
-3

我试图通过windows服务创建JVM,但JNI_CreateJavaVM总是失败。这里是我的代码,JNI_CreateJavaVM总是失败

DWORD WINAPI InvokeMain(LPVOID lpParam) { 
    // HACK to hang the function 
    while(1) { 
     if((_access("e:\\file", 0)) != -1) { 
      break; 
     } 
    } 
    //Load the JVM Dll 
    HINSTANCE ghDllInstance = LoadLibrary(L"E:\\jdk1.6.0_26\\jre\\bin\\server\\jvm.dll"); 

    if(ghDllInstance == 0) { 
     Log("Failed to load jvm dll\n"); 
     return FALSE; 
    } 
    //resolve the function pointer JNI_CreateJVM 
    CreateJavaVM createJVMStart = (CreateJavaVM)GetProcAddress(ghDllInstance, "JNI_CreateJavaVM"); 

    JavaVMOption options[2]; 
    options[0].optionString = "-Djava.class.path=e:\\win\\product\\lib"; // application class path 
    options[1].optionString = " start"; 

    JavaVMInitArgs vm_args; 
    vm_args.version   = JNI_VERSION_1_6; //JNI Version 1.4 and above 
    vm_args.options   = options; 
    vm_args.nOptions   = 2; 
    vm_args.ignoreUnrecognized = JNI_FALSE; 


    //Create the JVM 
    JavaVM *vmStart; 
    JNIEnv *env; 
    jint res = createJVMStart(&vmStart, (void **)&env, &vm_args); 
    if (res < 0) { 
     Log("Error creating JVM"); 
     return FALSE; 
    }  
    return TRUE; 
} 
+2

如果你说它失败了,它可能会有所帮助。 – 2012-07-09 07:23:14

+0

是否有加载JVM而不是链接到它的原因?链接使代码更容易。 – EJP 2012-07-09 10:15:24

+0

@EJP:你能解释一下吗? – Avinash 2012-07-09 10:44:03

回答

1

我从来没有使用1.6 VM。但我很肯定start不是一个有效的选项。
而且由于您将JNI_FALSE传递给ignoreUnrecognized,因此未创建VM。
我想开始是你的程序的参数。但是,你需要将它传递给主函数。