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.