/*--------------------------------------------------------------------------*/ static JavaVM *SearchCreatedJavaVMEmbedded(char *SCILAB_PATH) { JavaVM *jvm = NULL; jsize jvm_count = 0; jint res=0; char *JVMDLLFULLNAME=NULL; /* search in SCI/java/jre */ JVMDLLFULLNAME=(char*)MALLOC( (strlen(SCILAB_PATH)+strlen(JRE_PATH)+strlen("/bin/")+strlen(JVM_TYPE)+strlen("/jvm")+strlen(SHARED_LIB_EXT)+1)*sizeof(char)); sprintf(JVMDLLFULLNAME,"%s%s%s%s%s%s",SCILAB_PATH,JRE_PATH,"/bin/",JVM_TYPE,"/jvm",SHARED_LIB_EXT); FreeDynLibJVM(); if (LoadFunctionsJVM(JVMDLLFULLNAME)) { res = SciJNI_GetCreatedJavaVMs (&jvm, 1, &jvm_count); if ( jvm_count == 1 ) { if (JVMDLLFULLNAME){FREE(JVMDLLFULLNAME);JVMDLLFULLNAME=NULL;} return jvm; } else jvm = NULL; } if (JVMDLLFULLNAME){FREE(JVMDLLFULLNAME);JVMDLLFULLNAME=NULL;} return jvm; }
/*----------------------------------------------------------------------------------*/ static JavaVM *SearchCreatedJavaVMPath(void) { JavaVM *jvm = NULL; jsize jvm_count = 0; jint res = 0; char *JVMDLLFULLNAME = NULL; FreeDynLibJVM(); JVMDLLFULLNAME = (char*)MALLOC( (strlen("jvm") + strlen(SHARED_LIB_EXT) + 1) * sizeof(char)); sprintf(JVMDLLFULLNAME, "%s%s", "jvm", SHARED_LIB_EXT); if (LoadFunctionsJVM(JVMDLLFULLNAME)) { res = SciJNI_GetCreatedJavaVMs (&jvm, 1, &jvm_count); if ( jvm_count == 1 ) { if (JVMDLLFULLNAME) { FREE(JVMDLLFULLNAME); JVMDLLFULLNAME = NULL; }; return jvm; } else { jvm = NULL; } } return jvm; }
/*----------------------------------------------------------------------------------*/ JavaVM *SearchCreatedJavaVMRegistry(void) { JavaVM *jvm = NULL; jsize jvm_count = 0; jint res = 0; char *JVMDLLFULLNAME = NULL; JVMDLLFULLNAME = Search_Java_RuntimeLib_in_Windows_Registry(); FreeDynLibJVM(); if (LoadFunctionsJVM(JVMDLLFULLNAME)) { res = SciJNI_GetCreatedJavaVMs (&jvm, 1, &jvm_count); if ( jvm_count == 1 ) { if (JVMDLLFULLNAME) { FREE(JVMDLLFULLNAME); JVMDLLFULLNAME = NULL; } return jvm; } else { jvm = NULL; } } if (JVMDLLFULLNAME) { FREE(JVMDLLFULLNAME); JVMDLLFULLNAME = NULL; } return jvm; }
/*--------------------------------------------------------------------------*/ BOOL finishJVM(void) { BOOL bOK = FALSE; if (jvm_SCILAB) { // Detach the shared thread, to let the JVM finish itself (*jvm_SCILAB)->DetachCurrentThread(jvm_SCILAB); // force destroy the JVM (commented due to the javasci case) // (*jvm_SCILAB)->DestroyJavaVM(jvm_SCILAB); } if (FreeDynLibJVM()) { jvm_SCILAB = NULL; bOK = TRUE; } freeJavaVMOption(); return bOK; }
/*--------------------------------------------------------------------------*/ BOOL startJVM(char *SCI_PATH) { JNIEnv *env = NULL; JavaVM *ptr_jvm = NULL; jint res = 0; if (IsFromJava()) { ptr_jvm = FindCreatedJavaVM(SCI_PATH); if (ptr_jvm) /* a jvm already exists in scilab process */ { HadAlreadyJavaVm = TRUE; jvm_SCILAB = ptr_jvm; env = getScilabJNIEnv(); } else { fprintf(stderr, _("\nWeird error. Calling from Java but haven't been able to find the already existing JVM.\n")); FreeDynLibJVM(); return FALSE; } } else { if (!LoadDynLibJVM(SCI_PATH)) { fprintf(stderr, _("\nCould not load JVM dynamic library (libjava).\n")); fprintf(stderr, _("Error: %s\n"), GetLastDynLibError()); fprintf(stderr, _("If you are using a binary version of Scilab, please report a bug http://bugzilla.scilab.org/.\n")); fprintf(stderr, _("If you are using a self-built version of Scilab, update the script bin/scilab to provide the path to the JVM.\n")); fprintf(stderr, _("The problem might be related to SELinux. Try to deactivate it.\n")); fprintf(stderr, _("Please also check that you are not trying to run Scilab 64 bits on a 32 bits system (or vice versa).\n")); return FALSE; } else { /** * http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/invocation.html#wp15956 */ #define JVM_OPTIONS_FILENAME_FORMAT "%s/etc/jvm_options.xml" char *jvm_options_filename = NULL; long status = 0; JavaVMInitArgs vm_args; jvm_options_filename = (char *)MALLOC(sizeof(char) * ((int)strlen(JVM_OPTIONS_FILENAME_FORMAT) + (int)strlen(SCI_PATH) + 1)); sprintf(jvm_options_filename, JVM_OPTIONS_FILENAME_FORMAT, SCI_PATH); jvm_options = getJvmOptions(SCI_PATH, jvm_options_filename, &nOptions); if ((jvm_options == NULL) || (nOptions == 0)) { #ifdef _MSC_VER { #define FORMAT_MSG "\nImpossible to read %s.\n" char *msg = (char *)MALLOC(sizeof(char) * ((int)strlen(_(FORMAT_MSG)) + (int)strlen(jvm_options_filename) + 1)); if (msg) { sprintf(msg, _(FORMAT_MSG), jvm_options_filename); MessageBox(NULL, msg, gettext("Error"), MB_ICONEXCLAMATION | MB_OK); FREE(msg); msg = NULL; } } #else fprintf(stderr, _("\nImpossible to read %s.\n"), jvm_options_filename); #endif if (jvm_options_filename) { FREE(jvm_options_filename); jvm_options_filename = NULL; } exit(1); } else { if (jvm_options_filename) { FREE(jvm_options_filename); jvm_options_filename = NULL; } HadAlreadyJavaVm = FALSE; memset(&vm_args, 0, sizeof(vm_args)); SciJNI_GetDefaultJavaVMInitArgs(&vm_args); #ifdef JNI_VERSION_1_6 vm_args.version = JNI_VERSION_1_6; #elif JNI_VERSION_1_4 vm_args.version = JNI_VERSION_1_4; #else #ifdef _MSC_VER MessageBox(NULL, gettext("\nIncorrect version JNI (needs at least JDK 1.4).\n"), gettext("Error"), MB_ICONEXCLAMATION | MB_OK); #else fprintf(stderr, gettext("\nIncorrect version JNI (needs at least JDK 1.4).\n")); #endif exit(1); #endif vm_args.options = jvm_options; vm_args.nOptions = nOptions; vm_args.ignoreUnrecognized = FALSE; status = SciJNI_CreateJavaVM(&jvm_SCILAB, (JNIEnv **) & env, &vm_args); if (status != JNI_OK) { fprintf(stderr, _("Error in the creation of the Java VM: %s\n"), getJniErrorFromStatusCode(status)); FreeDynLibJVM(); if (vm_args.options) { int j = 0; fprintf(stderr, _("Options:\n")); for (j = 0; j < vm_args.nOptions; j++) { fprintf(stderr, "%d: %s\n", j, vm_args.options[j]); } } return FALSE; } } } } res = (*jvm_SCILAB)->AttachCurrentThread(jvm_SCILAB, (void **)&env, (void *)NULL); if (res != 0) { #ifdef _MSC_VER MessageBox(NULL, gettext("\nJVM error in AttachCurrentThread: Could not attach to the current thread.\n"), gettext("Error"), MB_ICONEXCLAMATION | MB_OK); #else fprintf(stderr, gettext("\nJVM error in AttachCurrentThread: Could not attach to the current thread.\n")); #endif FreeDynLibJVM(); freeJavaVMOption(); return FALSE; } else { return TRUE; } }