summaryrefslogtreecommitdiff
path: root/modules/jvm/src/c/JVM_commons.c
blob: 1a7b819c957d5e31055c2011088a889d3736712b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/*
 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 * Copyright (C) INRIA - Allan CORNET
 * Copyright (C) 2007-2008 - INRIA - Sylvestre LEDRU
 * Copyright (C) 2010 - DIGITEO - Allan CORNET
 *
 * This file must be used under the terms of the CeCILL.
 * This source file is licensed as described in the file COPYING, which
 * you should have received as part of this distribution.  The terms
 * are also available at
 * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
 *
 */

/*--------------------------------------------------------------------------*/
#include <stdio.h>
#include "JVM_commons.h"
#include "dynamiclibrary.h"
#include "localization.h"
#include "getshortpathname.h"
#include "BOOL.h"
#include "MALLOC.h"
#include "charEncoding.h"
/*--------------------------------------------------------------------------*/
static DynLibHandle hLibJVM = NULL;
static BOOL bSymbolsLoaded = FALSE;
/*--------------------------------------------------------------------------*/
typedef jint (JNICALL *JNI_CreateJavaVMPROC) (JavaVM **jvm, JNIEnv **penv, JavaVMInitArgs *args);
typedef jint (JNICALL *JNI_GetCreatedJavaVMsPROC)(JavaVM **vmBuf, jsize BufLen, jsize *nVMs);
typedef jint (JNICALL *JNI_GetDefaultJavaVMInitArgsPROC)(JavaVMInitArgs *args);
/*--------------------------------------------------------------------------*/
static JNI_GetDefaultJavaVMInitArgsPROC ptr_JNI_GetDefaultJavaVMInitArgs = NULL;
static JNI_CreateJavaVMPROC ptr_JNI_CreateJavaVM  = NULL;
static JNI_GetCreatedJavaVMsPROC ptr_JNI_GetCreatedJavaVMs = NULL;
/*--------------------------------------------------------------------------*/
jint SciJNI_GetDefaultJavaVMInitArgs(JavaVMInitArgs *args)
{
    if (ptr_JNI_GetDefaultJavaVMInitArgs)
    {
        return (ptr_JNI_GetDefaultJavaVMInitArgs)(args);
    }
    return JNI_ERR;
}
/*--------------------------------------------------------------------------*/
jint SciJNI_CreateJavaVM(JavaVM **jvm, JNIEnv **penv, JavaVMInitArgs *args)
{
    if (ptr_JNI_CreateJavaVM)
    {
        return (ptr_JNI_CreateJavaVM)(jvm, penv, args);
    }
    return JNI_ERR;
}
/*--------------------------------------------------------------------------*/
jint SciJNI_GetCreatedJavaVMs(JavaVM **vmBuf, jsize BufLen, jsize *nVMs)
{
    if (ptr_JNI_GetCreatedJavaVMs)
    {
        return (ptr_JNI_GetCreatedJavaVMs)(vmBuf, BufLen, nVMs);
    }
    return JNI_ERR;
}
/*--------------------------------------------------------------------------*/
BOOL FreeDynLibJVM(void)
{
    if (hLibJVM)
    {
        if (FreeDynLibrary(hLibJVM))
        {
            ptr_JNI_GetDefaultJavaVMInitArgs = NULL;
            ptr_JNI_CreateJavaVM = NULL;
            ptr_JNI_GetCreatedJavaVMs = NULL;
            hLibJVM = NULL;
            bSymbolsLoaded = FALSE;
            return TRUE;
        }
    }
    return FALSE;
}
/*--------------------------------------------------------------------------*/
BOOL LoadFunctionsJVM(char *filedynlib)
{
#ifdef _MSC_VER
    if (filedynlib == NULL)
    {
        hLibJVM = LoadDynLibraryW(L"jvm.dll");
    }
    else
    {
        wchar_t * wcfiledynlib = to_wide_string(filedynlib);
        if (wcfiledynlib)
        {
            hLibJVM = LoadDynLibraryW(wcfiledynlib);
            FREE(wcfiledynlib);
            wcfiledynlib = NULL;
        }
    }
#else
#ifdef __APPLE__
    /*
    ** After MacOSX 10.6.8 manually load libjava.jnilib make JNI_* functions crash
    ** Rely on OS by using dlopen(NULL) to find correct symbol with dlsym
    */
    hLibJVM = LoadDynLibrary(NULL);
#else
    if (filedynlib == NULL)
    {
        hLibJVM = LoadDynLibrary(NULL);
    }
    else
    {
        hLibJVM = LoadDynLibrary(filedynlib);
    }
#endif
#endif

    if (hLibJVM)
    {
        ptr_JNI_GetDefaultJavaVMInitArgs = (JNI_GetDefaultJavaVMInitArgsPROC) GetDynLibFuncPtr(hLibJVM, "JNI_GetDefaultJavaVMInitArgs" );
        ptr_JNI_CreateJavaVM = (JNI_CreateJavaVMPROC) GetDynLibFuncPtr(hLibJVM, "JNI_CreateJavaVM" );
        ptr_JNI_GetCreatedJavaVMs = (JNI_GetCreatedJavaVMsPROC) GetDynLibFuncPtr(hLibJVM, "JNI_GetCreatedJavaVMs" );

        if (ptr_JNI_GetDefaultJavaVMInitArgs && ptr_JNI_CreateJavaVM && ptr_JNI_GetCreatedJavaVMs)
        {
            bSymbolsLoaded = TRUE;
            return TRUE;
        }
    }
    return FALSE;
}
/*--------------------------------------------------------------------------*/
char *getJniErrorFromStatusCode(long status)
{
    switch (status)
    {
        case JNI_ERR:
            return _("Unknown JNI error");
            break;
        case JNI_EDETACHED:
            return _("Thread detached from the VM");
            break;
        case JNI_EVERSION:
            return _("JNI version error");
            break;
#ifdef JNI_ENOMEM
            /* ifdef because not defined with some version of gcj */
        case JNI_ENOMEM:
            return _("JNI: not enough memory");
            break;
#endif
#ifdef JNI_EEXIST
            /* ifdef because not defined with some version of gcj */
        case JNI_EEXIST:
            return _("VM already created");
            break;
#endif
#ifdef JNI_EINVAL
            /* ifdef because not defined with some version of gcj */
        case JNI_EINVAL:
            return _("JNI: invalid arguments");
            break;
#endif
        default:
            return _("Undefined error code in the JNI. Weird problem");
            break;
    }
}
/*--------------------------------------------------------------------------*/
BOOL hasJvmSymbolsLoaded(void)
{
    return bSymbolsLoaded;
}
/*--------------------------------------------------------------------------*/