Ejemplo n.º 1
0
/*--------------------------------------------------------------------------*/
JavaVM *getScilabJavaVM(void)
{
    if (!jvm_SCILAB && IsFromJava())
    {
        /* If getScilabJavaVM is called from C called itself from JavaSci
        * (in nwni mode) the function returns a JVM */
        JavaVM *vm = 0;
        JavaVM **vmBuf = MALLOC(sizeof(JavaVM *) * 1);
        jsize size = 0;

        if (!hasJvmSymbolsLoaded())
        {
            /* We load symbols of the current jvm already used */
            LoadFunctionsJVM(NULL);
        }

        SciJNI_GetCreatedJavaVMs(vmBuf, 1, &size);

        if (size)
        {
            vm = *vmBuf;
        }
        FREE(vmBuf);

        return vm;
    }

    return jvm_SCILAB;
}
Ejemplo n.º 2
0
/*--------------------------------------------------------------------------*/
int sci_fromjava(char *fname, unsigned long fname_len)
{
    static int n1;
    int *paramoutINT = (int*)MALLOC(sizeof(int) + 1);

    Rhs = Max(0, Rhs);
    CheckRhs(0, 0);
    CheckLhs(1, 1);

    if ( IsFromJava() )
    {
        *paramoutINT = (int)(TRUE);
    }
    else
    {
        *paramoutINT = (int)(FALSE);
    }

    n1 = 1;
    CreateVarFromPtr(Rhs + 1, MATRIX_OF_BOOLEAN_DATATYPE, &n1, &n1, &paramoutINT);
    if (paramoutINT)
    {
        FREE(paramoutINT);
        paramoutINT = NULL;
    }
    LhsVar(1) = Rhs + 1;
    PutLhsVar();

    return 0;
}
Ejemplo n.º 3
0
/*--------------------------------------------------------------------------*/
BOOL InitializeJVM(void)
{
    BOOL bOK = FALSE;
    char *sciPath = NULL;

    sciPath = getSCI();

    if (!startJVM(sciPath))
    {
#ifdef _MSC_VER
        MessageBox(NULL, gettext("\nScilab cannot open JVM library.\n"), gettext("Error"), MB_ICONEXCLAMATION | MB_OK);
#else
        fprintf(stderr, _("\nScilab cannot open JVM library.\n"));
#endif
    }
    else
    {
        DoLoadLibrarypathInEtc(sciPath);
        DoLoadClasspathInEtc(sciPath);

        if (!createMainScilabObject())
        {
            char *errorMsg = os_strdup(gettext("\nScilab cannot create Scilab Java Main-Class (we have not been able to find the main Scilab class. Check if the Scilab and thirdparty packages are available).\n"));

            if (IsFromJava())
            {
                char *errorMsg2 = gettext("If Scilab is used from Java, make sure that your IDE (ex: Netbeans, etc) is not adding extra dependencies which could not be found at runtime.\n");
                char *tempMsg = (char*)MALLOC(sizeof(char) * (strlen(errorMsg) + strlen(errorMsg2) + 1));
                if (tempMsg)
                {
                    strcpy(tempMsg, errorMsg);
                    strcat(tempMsg, errorMsg2);
                    FREE(errorMsg);
                    errorMsg = tempMsg;
                }
            }
#ifdef _MSC_VER
            MessageBox(NULL, errorMsg, gettext("Error"), MB_ICONEXCLAMATION | MB_OK);
#else
            fprintf(stderr, "%s", errorMsg);
#endif
            if (errorMsg)
            {
                FREE(errorMsg);
                errorMsg = NULL;
            }
        }
        else
        {
            bOK = TRUE;
        }
    }

    if (sciPath)
    {
        FREE(sciPath);
        sciPath = NULL;
    }

    if (!bOK)
    {
        exit(1);
    }

    return TRUE;
}
Ejemplo n.º 4
0
/*--------------------------------------------------------------------------*/
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;
    }
}