2012-07-09 182 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。
我想開始是你的程序的參數。但是,你需要將它傳遞給主函數。