Skip to Main Content

Java HotSpot Virtual Machine

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Does CallStaticVoidMethod return inmediately?

843829Aug 19 2004 — edited Nov 8 2004
I'm writing a Window application which has to invoke the JVM. The routine is more or lees like this:
int InvokeJavaVirtualMachine()
{
    char sJRERuntimeLib[512];
    
    HMODULE hModule;
    p_JNI_GetDefaultJavaVMInitArgs p_JNI_GetDefaultJavaVMInitArgs_function;
    p_JNI_CreateJavaVM p_JNI_CreateJavaVM_function;

    JavaVM* javaVM;
    JNIEnv* jniEnv;
    JavaVMInitArgs javaVMInitArgs;
    JavaVMOption javaVMOptions[1];
    jint jintRes;
    jclass jclassString;
    jclass jclassMainClass;
    jmethodID jmethodIDMain;
    jstring jstringMainParameter;
    jobjectArray jobjectArrayArgs;
    
    int iReturnCode = 0;

    if (GetJRERuntimeLib("1.4", sJRERuntimeLib)!=0) {
        iReturnCode = -1;
        goto invokejavavirtualmachine_error;
    }
   
   
    hModule = LoadLibrary(sJRERuntimeLib);
    if (hModule==NULL) {
        iReturnCode = -2;
        goto invokejavavirtualmachine_error;
    }
    
    p_JNI_GetDefaultJavaVMInitArgs_function = (p_JNI_GetDefaultJavaVMInitArgs)GetProcAddress(hModule, "JNI_GetDefaultJavaVMInitArgs");
    if (p_JNI_GetDefaultJavaVMInitArgs_function==NULL) {
        iReturnCode = -3;
        goto invokejavavirtualmachine_error;
    }    
    p_JNI_CreateJavaVM_function = (p_JNI_CreateJavaVM)GetProcAddress(hModule, "JNI_CreateJavaVM");
    if (p_JNI_CreateJavaVM_function==NULL) {
        iReturnCode = -4;
        goto invokejavavirtualmachine_error;
    }    

    javaVMOptions[0].optionString = USER_CLASSPATH;
    javaVMInitArgs.version = JNI_VERSION_1_2;
    javaVMInitArgs.options = javaVMOptions;
    javaVMInitArgs.nOptions = 1;
    javaVMInitArgs.ignoreUnrecognized = JNI_TRUE;
    
    jintRes = (p_JNI_CreateJavaVM_function)(&javaVM, (void**)&jniEnv, &javaVMInitArgs);
    if (jintRes<0) {
        iReturnCode = -5;
        goto invokejavavirtualmachine_error;
    }
    
    jclassMainClass = (*jniEnv)->FindClass(jniEnv, "JApp");
    if (jclassMainClass==NULL) {
        iReturnCode = -6;
        goto invokejavavirtualmachine_error;
    }
    
    jmethodIDMain = (*jniEnv)->GetStaticMethodID(jniEnv, jclassMainClass, "main", "([Ljava/lang/String;)V");
    if (jmethodIDMain == NULL) {
        iReturnCode = -7;
        goto invokejavavirtualmachine_error;
    }
    
    jstringMainParameter = (*jniEnv)->NewStringUTF(jniEnv, " from C!");
    if (jstringMainParameter == NULL) {
        iReturnCode = -8;
        goto invokejavavirtualmachine_error;
    }
    jclassString = (*jniEnv)->FindClass(jniEnv, "java/lang/String");
    if (jclassString==NULL) {
        iReturnCode = -9;
        goto invokejavavirtualmachine_error;
    }
    jobjectArrayArgs = (*jniEnv)->NewObjectArray(jniEnv, 1, jclassString, jstringMainParameter);
    (*jniEnv)->CallStaticVoidMethod(jniEnv, jclassMainClass, jmethodIDMain, jobjectArrayArgs);
    
    invokejavavirtualmachine_error:
        if ((*jniEnv)->ExceptionOccurred(jniEnv)) {
            (*jniEnv)->ExceptionDescribe(jniEnv);
        }
       if (javaVM!=NULL && (*javaVM)!=NULL) (*javaVM)->DestroyJavaVM(javaVM); 
        if (hModule!=NULL) FreeLibrary(hModule);
        
        return iReturnCode;
}
Everything seems to work fine but CallStaticVoidMethod doesn't wait for the Java application to end. It returns inmediately. Is this normal?

Besides when I clic on the close button in the Java application, the Window application whick invoked the Java application is closed too. Is this normal?

Any help would be welcomed. Thanks.
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Dec 6 2004
Added on Aug 19 2004
13 comments
940 views