Merge remote-tracking branch 'origin/master' into windows
[scilab.git] / scilab / modules / jvm / src / c / JVM_commons.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) INRIA - Allan CORNET
4  * Copyright (C) 2007-2008 - INRIA - Sylvestre LEDRU
5  * Copyright (C) 2010 - DIGITEO - Allan CORNET
6  *
7  * Copyright (C) 2012 - 2016 - Scilab Enterprises
8  *
9  * This file is hereby licensed under the terms of the GNU GPL v2.0,
10  * pursuant to article 5.3.4 of the CeCILL v.2.1.
11  * This file was originally licensed under the terms of the CeCILL v2.1,
12  * and continues to be available under such terms.
13  * For more information, see the COPYING file which you should have received
14  * along with this program.
15  *
16  */
17
18 /*--------------------------------------------------------------------------*/
19 #include <stdio.h>
20 #include "JVM_commons.h"
21 #include "dynamiclibrary.h"
22 #include "localization.h"
23 #include "getshortpathname.h"
24 #include "BOOL.h"
25 #include "sci_malloc.h"
26 #include "charEncoding.h"
27 /*--------------------------------------------------------------------------*/
28 static DynLibHandle hLibJVM = NULL;
29 static BOOL bSymbolsLoaded = FALSE;
30 /*--------------------------------------------------------------------------*/
31 typedef jint (JNICALL *JNI_CreateJavaVMPROC) (JavaVM **jvm, JNIEnv **penv, JavaVMInitArgs *args);
32 typedef jint (JNICALL *JNI_GetCreatedJavaVMsPROC)(JavaVM **vmBuf, jsize BufLen, jsize *nVMs);
33 typedef jint (JNICALL *JNI_GetDefaultJavaVMInitArgsPROC)(JavaVMInitArgs *args);
34 /*--------------------------------------------------------------------------*/
35 static JNI_GetDefaultJavaVMInitArgsPROC ptr_JNI_GetDefaultJavaVMInitArgs = NULL;
36 static JNI_CreateJavaVMPROC ptr_JNI_CreateJavaVM  = NULL;
37 static JNI_GetCreatedJavaVMsPROC ptr_JNI_GetCreatedJavaVMs = NULL;
38 /*--------------------------------------------------------------------------*/
39 jint SciJNI_GetDefaultJavaVMInitArgs(JavaVMInitArgs *args)
40 {
41     if (ptr_JNI_GetDefaultJavaVMInitArgs)
42     {
43         return (ptr_JNI_GetDefaultJavaVMInitArgs)(args);
44     }
45     return JNI_ERR;
46 }
47 /*--------------------------------------------------------------------------*/
48 jint SciJNI_CreateJavaVM(JavaVM **jvm, JNIEnv **penv, JavaVMInitArgs *args)
49 {
50     if (ptr_JNI_CreateJavaVM)
51     {
52         return (ptr_JNI_CreateJavaVM)(jvm, penv, args);
53     }
54     return JNI_ERR;
55 }
56 /*--------------------------------------------------------------------------*/
57 jint SciJNI_GetCreatedJavaVMs(JavaVM **vmBuf, jsize BufLen, jsize *nVMs)
58 {
59     if (ptr_JNI_GetCreatedJavaVMs)
60     {
61         return (ptr_JNI_GetCreatedJavaVMs)(vmBuf, BufLen, nVMs);
62     }
63     return JNI_ERR;
64 }
65 /*--------------------------------------------------------------------------*/
66 BOOL FreeDynLibJVM(void)
67 {
68     if (hLibJVM)
69     {
70         if (FreeDynLibrary(hLibJVM))
71         {
72             ptr_JNI_GetDefaultJavaVMInitArgs = NULL;
73             ptr_JNI_CreateJavaVM = NULL;
74             ptr_JNI_GetCreatedJavaVMs = NULL;
75             hLibJVM = NULL;
76             bSymbolsLoaded = FALSE;
77             return TRUE;
78         }
79     }
80     return FALSE;
81 }
82 /*--------------------------------------------------------------------------*/
83 BOOL LoadFunctionsJVM(const char *filedynlib)
84 {
85 #ifdef _MSC_VER
86     if (filedynlib == NULL)
87     {
88         hLibJVM = LoadDynLibrary("jvm.dll");
89     }
90     else
91     {
92         hLibJVM = LoadDynLibrary(filedynlib);
93     }
94 #else
95 #ifdef __APPLE__
96     /*
97     ** After MacOSX 10.6.8 manually load libjava.jnilib make JNI_* functions crash
98     ** Rely on OS by using dlopen(NULL) to find correct symbol with dlsym
99     */
100     hLibJVM = LoadDynLibrary(NULL);
101 #else
102     if (filedynlib == NULL)
103     {
104         hLibJVM = LoadDynLibrary(NULL);
105     }
106     else
107     {
108         hLibJVM = LoadDynLibrary(filedynlib);
109     }
110 #endif
111 #endif
112
113     if (hLibJVM)
114     {
115         ptr_JNI_GetDefaultJavaVMInitArgs = (JNI_GetDefaultJavaVMInitArgsPROC) GetDynLibFuncPtr(hLibJVM, "JNI_GetDefaultJavaVMInitArgs" );
116         ptr_JNI_CreateJavaVM = (JNI_CreateJavaVMPROC) GetDynLibFuncPtr(hLibJVM, "JNI_CreateJavaVM" );
117         ptr_JNI_GetCreatedJavaVMs = (JNI_GetCreatedJavaVMsPROC) GetDynLibFuncPtr(hLibJVM, "JNI_GetCreatedJavaVMs" );
118
119         if (ptr_JNI_GetDefaultJavaVMInitArgs && ptr_JNI_CreateJavaVM && ptr_JNI_GetCreatedJavaVMs)
120         {
121             bSymbolsLoaded = TRUE;
122             return TRUE;
123         }
124     }
125     return FALSE;
126 }
127 /*--------------------------------------------------------------------------*/
128 char *getJniErrorFromStatusCode(long status)
129 {
130     switch (status)
131     {
132         case JNI_ERR:
133             return _("Unknown JNI error");
134             break;
135         case JNI_EDETACHED:
136             return _("Thread detached from the VM");
137             break;
138         case JNI_EVERSION:
139             return _("JNI version error");
140             break;
141 #ifdef JNI_ENOMEM
142         /* ifdef because not defined with some version of gcj */
143         case JNI_ENOMEM:
144             return _("JNI: not enough memory");
145             break;
146 #endif
147 #ifdef JNI_EEXIST
148         /* ifdef because not defined with some version of gcj */
149         case JNI_EEXIST:
150             return _("VM already created");
151             break;
152 #endif
153 #ifdef JNI_EINVAL
154         /* ifdef because not defined with some version of gcj */
155         case JNI_EINVAL:
156             return _("JNI: invalid arguments");
157             break;
158 #endif
159         default:
160             return _("Undefined error code in the JNI. Weird problem");
161             break;
162     }
163 }
164 /*--------------------------------------------------------------------------*/
165 BOOL hasJvmSymbolsLoaded(void)
166 {
167     return bSymbolsLoaded;
168 }
169 /*--------------------------------------------------------------------------*/