29 #define DELAYIMP_INSECURE_WRITABLE_HOOKS 31 #pragma comment(lib, "delayimp") 32 #pragma comment(lib, "jvm") 56 #define JVM_LIB_PATH "jre/lib/sparc/client" 57 #define JVM_LIB_PATH_JDK11 "lib/server" 58 #elif defined(WINDOWS) 60 #define JVM_LIB_PATH_JDK "jre\\bin\\client" 61 #define JVM_LIB_PATH_JRE "bin\\client" 62 #define JVM_LIB_PATH_JDK11 "" 64 #define JVM_LIB_PATH_JDK "jre\\bin\\server" 65 #define JVM_LIB_PATH_JRE "bin\\server" 66 #define JVM_LIB_PATH_JDK11 "bin\\server" 68 #elif defined(HPUX) && defined(IA64) 69 #define JVM_LIB_PATH "jre/lib/IA64N/hotspot" 70 #define JVM_LIB_PATH_JDK11 "lib/IA64N/server" 71 #elif defined(HPUX) && !defined(IA64) 72 #define JVM_LIB_PATH "jre/lib/PA_RISC2.0/hotspot" 73 #define JVM_LIB_PATH_JDK11 "lib/PA_RISC2.0/server" 76 #define JVM_LIB_PATH "jre/bin/classic" 77 #define JVM_LIB_PATH_JDK11 "lib/server" 78 #elif __WORDSIZE == 64 79 #define JVM_LIB_PATH "jre/lib/ppc64/classic" 80 #define JVM_LIB_PATH_JDK11 "lib/server" 82 #elif defined(__i386) || defined(__x86_64) 84 #define JVM_LIB_PATH "jre/lib/i386/client" 85 #define JVM_LIB_PATH_JDK11 "lib/server" 87 #define JVM_LIB_PATH "jre/lib/amd64/server" 88 #define JVM_LIB_PATH_JDK11 "lib/server" 91 #define JVM_LIB_PATH "" 92 #define JVM_LIB_PATH_JDK11 "" 97 #define JVM_LIB_FILE "libjvm.so" 98 #elif defined(HPUX) && !defined(IA64) 99 #define JVM_LIB_FILE "libjvm.sl" 101 #define JVM_LIB_FILE "libjvm.so" 106 #define REGKEY_JAVA "Software\\JavaSoft\\Java Runtime Environment" 109 #define BUF_SIZE 2048 113 #define JVM_GetEnv(JVM, ENV, VER) \ 114 (JVM)->GetEnv(ENV, VER) 115 #define JVM_AttachCurrentThread(JVM, ENV, ARGS) \ 116 (JVM)->AttachCurrentThread(ENV, ARGS) 117 #define JVM_DetachCurrentThread(JVM) \ 118 (JVM)->DetachCurrentThread() 119 #define JVM_ExceptionOccurred(ENV) \ 120 (ENV)->ExceptionOccurred() 121 #define JVM_FindClass(ENV, NAME) \ 122 (ENV)->FindClass(NAME) 123 #define JVM_GetStaticMethodID(ENV, CLAZZ, NAME, SIG) \ 124 (ENV)->GetStaticMethodID(CLAZZ, NAME, SIG) 125 #define JVM_NewStringUTF(ENV, BYTES) \ 126 (ENV)->NewStringUTF(BYTES); 127 #define JVM_NewObjectArray(ENV, LENGTH, ELEMENTCLASS, INITIALCLASS) \ 128 (ENV)->NewObjectArray(LENGTH, ELEMENTCLASS, INITIALCLASS) 129 #define JVM_SetObjectArrayElement(ENV, ARRAY, INDEX, VALUE) \ 130 (ENV)->SetObjectArrayElement(ARRAY, INDEX, VALUE) 131 #define JVM_CallStaticVoidMethod(ENV, CLAZZ, METHODID, ARGS) \ 132 (ENV)->CallStaticVoidMethod(CLAZZ, METHODID, ARGS) 133 #define JVM_CallStaticIntMethod(ENV, CLAZZ, METHODID, ARGS) \ 134 (ENV)->CallStaticIntMethod(CLAZZ, METHODID, ARGS) 135 #define JVM_CallStaticObjectMethod(ENV, CLAZZ, METHODID, ARGS) \ 136 (ENV)->CallStaticObjectMethod(CLAZZ, METHODID, ARGS) 137 #define JVM_GetStringUTF(ENV, STRING) \ 138 (ENV)->GetStringUTFChars(STRING, NULL) 139 #define JVM_ReleaseStringUTF(ENV, JSTRING, CSTRING) \ 140 (ENV)->ReleaseStringUTFChars(JSTRING, CSTRING) 141 #define JVM_GetStringUTFLength(ENV, STRING) \ 142 (ENV)->GetStringUTFLength(STRING) 144 #define JVM_GetEnv(JVM, ENV, VER) \ 145 (*JVM)->GetEnv(JVM, ENV, VER) 146 #define JVM_AttachCurrentThread(JVM, ENV, ARGS) \ 147 (*JVM)->AttachCurrentThread(JVM, ENV, ARGS) 148 #define JVM_DetachCurrentThread(JVM) \ 149 (*JVM)->DetachCurrentThread(JVM) 150 #define JVM_ExceptionOccurred(ENV) \ 151 (*ENV)->ExceptionOccurred(ENV) 152 #define JVM_FindClass(ENV, NAME) \ 153 (*ENV)->FindClass(ENV, NAME) 154 #define JVM_GetStaticMethodID(ENV, CLAZZ, NAME, SIG) \ 155 (*ENV)->GetStaticMethodID(ENV, CLAZZ, NAME, SIG) 156 #define JVM_NewStringUTF(ENV, BYTES) \ 157 (*ENV)->NewStringUTF(ENV, BYTES); 158 #define JVM_NewObjectArray(ENV, LENGTH, ELEMENTCLASS, INITIALCLASS) \ 159 (*ENV)->NewObjectArray(ENV, LENGTH, ELEMENTCLASS, INITIALCLASS) 160 #define JVM_SetObjectArrayElement(ENV, ARRAY, INDEX, VALUE) \ 161 (*ENV)->SetObjectArrayElement(ENV, ARRAY, INDEX, VALUE) 162 #define JVM_CallStaticVoidMethod(ENV, CLAZZ, METHODID, ARGS) \ 163 (*ENV)->CallStaticVoidMethod(ENV, CLAZZ, METHODID, ARGS) 164 #define JVM_CallStaticIntMethod(ENV, CLAZZ, METHODID, ARGS) \ 165 (*ENV)->CallStaticIntMethod(ENV, CLAZZ, METHODID, ARGS) 166 #define JVM_CallStaticObjectMethod(ENV, CLAZZ, METHODID, ARGS) \ 167 (*ENV)->CallStaticObjectMethod(ENV, CLAZZ, METHODID, ARGS) 168 #define JVM_GetStringUTF(ENV, STRING) \ 169 (*ENV)->GetStringUTFChars(ENV, STRING, NULL) 170 #define JVM_ReleaseStringUTF(ENV, JSTRING, CSTRING) \ 171 (*ENV)->ReleaseStringUTFChars(ENV, JSTRING, CSTRING) 172 #define JVM_GetStringUTFLength(ENV, STRING) \ 173 (*ENV)->GetStringUTFLength(ENV, STRING) 183 int get_java_root_path (
char *path);
184 FARPROC WINAPI delay_load_hook (
unsigned dliNotify, PDelayLoadInfo pdli);
185 LONG WINAPI delay_load_dll_exception_filter (PEXCEPTION_POINTERS pep);
187 extern PfnDliHook __pfnDliNotifyHook2 = delay_load_hook;
188 extern PfnDliHook __pfnDliFailureHook2 = delay_load_hook;
205 get_java_root_path (
char *path)
210 char currentVersion[16];
211 char regkey_java_current_version[
BUF_SIZE];
220 rc = RegOpenKeyEx (HKEY_LOCAL_MACHINE, REGKEY_JAVA, 0, KEY_QUERY_VALUE, &hKeyReg);
221 if (rc != ERROR_SUCCESS)
226 len =
sizeof (currentVersion);
227 rc = RegQueryValueEx (hKeyReg,
"CurrentVersion", 0, &dwType, (LPBYTE) currentVersion, &len);
231 RegCloseKey (hKeyReg);
234 if (rc != ERROR_SUCCESS)
240 sprintf (regkey_java_current_version,
"%s\\%s", REGKEY_JAVA, currentVersion);
241 rc = RegOpenKeyEx (HKEY_LOCAL_MACHINE, regkey_java_current_version, 0, KEY_QUERY_VALUE, &hKeyReg);
243 if (rc != ERROR_SUCCESS)
248 len =
sizeof (java_root_path);
249 rc = RegQueryValueEx (hKeyReg,
"JavaHome", 0, &dwType, (LPBYTE) java_root_path, &len);
253 RegCloseKey (hKeyReg);
256 if (rc != ERROR_SUCCESS)
261 strcpy (path, java_root_path);
275 delay_load_hook (
unsigned dliNotify, PDelayLoadInfo pdli)
283 char *java_home =
NULL, *jvm_path =
NULL, *tmp =
NULL, *tail;
286 jvm_path = getenv (
"JVM_PATH");
287 java_home = getenv (
"JAVA_HOME");
291 err_msgs.append (
"\n\tFailed to load libjvm from 'JVM_PATH' envirnment variable: ");
295 libVM = LoadLibrary (jvm_path);
298 fp = (FARPROC) (HMODULE) libVM;
304 err_msgs.append (
"\n\tFailed to get 'JVM_PATH' environment variable");
307 tail = JVM_LIB_PATH_JDK;
308 if (java_home ==
NULL)
313 if (get_java_root_path (tmp))
316 tail = JVM_LIB_PATH_JRE;
323 err_msgs.append (
"\n\tFailed to load libjvm from 'JAVA_HOME' environment variable: ");
326 sprintf (jvm_lib_path,
"%s\\%s\\jvm.dll", java_home, tail);
331 libVM = LoadLibrary (jvm_lib_path);
335 fp = (FARPROC) (HMODULE) libVM;
342 sprintf (jvm_lib_path,
"%s\\%s\\jvm.dll", java_home, tail);
347 libVM = LoadLibrary (jvm_lib_path);
348 fp = (FARPROC) (HMODULE) libVM;
353 err_msgs.append (
"\n\tFailed to get 'JAVA_HOME' environment variable");
379 delay_load_dll_exception_filter (PEXCEPTION_POINTERS pep)
381 switch (pep->ExceptionRecord->ExceptionCode)
383 case VcppException (ERROR_SEVERITY_ERROR, ERROR_MOD_NOT_FOUND):
384 case VcppException (ERROR_SEVERITY_ERROR, ERROR_PROC_NOT_FOUND):
392 return EXCEPTION_EXECUTE_HANDLER;
407 void *libVM_p =
NULL;
409 char *jvm_path = getenv (
"JVM_PATH");
410 if (jvm_path !=
NULL)
412 libVM_p = dlopen (jvm_path, RTLD_NOW | RTLD_LOCAL);
415 return dlsym (libVM_p,
"JNI_CreateJavaVM");
419 err_msgs.append (
"\n\tFailed to load libjvm from 'JVM_PATH' environment variable: ");
426 err_msgs.append (
"\n\tFailed to get 'JVM_PATH' environment variable");
429 char *java_home = getenv (
"JAVA_HOME");
430 if (java_home !=
NULL)
432 char jvm_library_path[PATH_MAX];
433 err_msgs.append (
"\n\tFailed to load libjvm from 'JAVA_HOME' environment variable: ");
437 libVM_p = dlopen (jvm_library_path, RTLD_NOW | RTLD_LOCAL);
440 return dlsym (libVM_p,
"JNI_CreateJavaVM");
450 libVM_p = dlopen (jvm_library_path, RTLD_NOW | RTLD_LOCAL);
453 return dlsym (libVM_p,
"JNI_CreateJavaVM");
463 err_msgs.append (
"\n\tFailed to get 'JAVA_HOME' environment variable");
485 res = JNI_CreateJavaVM (&
jvm, (
void **) env_p, vm_arguments);
487 __except (delay_load_dll_exception_filter (GetExceptionInformation ()))
495 res = (*create_vm_func) (&
jvm, (
void **) env_p, (
void *) vm_arguments);
514 static std::vector <std::string>
517 std::string str (opt_str);
518 std::istringstream iss (str);
519 std::vector <std::string> options;
520 std::copy (std::istream_iterator <std::string> (iss),
521 std::istream_iterator <std::string> (), std::back_inserter (options));
539 jclass cls, string_cls;
540 JNIEnv *env_p =
NULL;
542 jstring jstr_dbname, jstr_path, jstr_version, jstr_envroot, jstr_port;
544 JavaVMInitArgs vm_arguments;
545 JavaVMOption *options;
546 int vm_n_options = 3;
547 char classpath[PATH_MAX + 32] = { 0 };
548 char logging_prop[PATH_MAX + 32] = { 0 };
549 char option_debug[70];
551 char debug_jdwp[] =
"-agentlib:jdwp=transport=dt_socket,server=y,address=%d,suspend=n";
552 char disable_sig_handle[] =
"-Xrs";
554 char jsp_file_path[PATH_MAX];
555 char port_str[6] = { 0 };
556 char *loc_p, *locale;
557 char *jvm_opt_sysprm =
NULL;
567 snprintf (classpath,
sizeof (classpath) - 1,
"-Djava.class.path=%s",
570 snprintf (logging_prop,
sizeof (logging_prop) - 1,
"-Djava.util.logging.config.file=%s",
574 if (debug_port != -1)
583 vm_n_options += (int) opts.size ();
584 options =
new JavaVMOption[vm_n_options];
592 options[0].optionString = classpath;
593 options[1].optionString = logging_prop;
594 options[2].optionString = disable_sig_handle;
595 if (debug_port != -1)
598 snprintf (option_debug,
sizeof (option_debug) - 1, debug_jdwp, debug_port);
600 options[4].optionString = option_debug;
603 for (
auto it = opts.begin (); it != opts.end (); ++it)
606 options[idx++].optionString = const_cast <
char*> (it->c_str ());
610 vm_arguments.version = JNI_VERSION_1_6;
611 vm_arguments.nOptions = vm_n_options;
612 vm_arguments.options = options;
613 vm_arguments.ignoreUnrecognized = JNI_TRUE;
616 loc_p = setlocale (LC_TIME,
NULL);
627 #if !defined(WINDOWS) 638 setlocale (LC_TIME, locale);
661 "GetStaticMethodID: " "com/cubrid/jsp/Server.main([Ljava/lang/String;)V");
666 if (jstr_dbname ==
NULL)
669 "Failed to construct a new 'java.lang.String object' by NewStringUTF()");
674 if (jstr_path ==
NULL)
677 "Failed to construct a new 'java.lang.String object' by NewStringUTF()");
682 if (jstr_version ==
NULL)
685 "Failed to construct a new 'java.lang.String object' by NewStringUTF()");
690 if (jstr_envroot ==
NULL)
693 "Failed to construct a new 'java.lang.String object' by NewStringUTF()");
697 sprintf (port_str,
"%d", port);
699 if (jstr_port ==
NULL)
702 "Failed to construct a new 'java.lang.String object' by NewStringUTF()");
707 if (string_cls ==
NULL)
717 "Failed to construct a new java array by NewObjectArray()");
731 "Error occured while starting Java SP Server by CallStaticIntMethod()");
753 #if defined (SA_MODE) 761 return jsp_info.port;
const char * envvar_root(void)
#define ER_SP_ALREADY_EXIST
#define JVM_ExceptionOccurred(ENV)
#define JVM_LIB_PATH_JDK11
const char * boot_db_name(void)
#define JVM_SetObjectArrayElement(ENV, ARRAY, INDEX, VALUE)
char * envvar_javadir_file(char *path, size_t size, const char *filename)
#define JVM_NewStringUTF(ENV, BYTES)
int jsp_jvm_is_loaded(void)
bool javasp_read_info(const char *db_name, JAVASP_SERVER_INFO &info)
const char * rel_build_number(void)
void er_set(int severity, const char *file_name, const int line_no, int err_id, int num_args,...)
int jsp_start_server(const char *db_name, const char *path, int port)
int prm_get_integer_value(PARAM_ID prm_id)
#define ER_SP_CANNOT_START_JVM
#define ER_OUT_OF_VIRTUAL_MEMORY
static std::vector< std::string > jsp_tokenize_jvm_options(char *opt_str)
#define JVM_CallStaticIntMethod(ENV, CLAZZ, METHODID, ARGS)
#define JVM_FindClass(ENV, NAME)
static std::string err_msgs
#define JVM_GetStaticMethodID(ENV, CLAZZ, NAME, SIG)
static int jsp_create_java_vm(JNIEnv **env_p, JavaVMInitArgs *vm_arguments)
static void error(const char *msg)
#define free_and_init(ptr)
char * prm_get_string_value(PARAM_ID prm_id)
static void * jsp_get_create_java_vm_function_ptr(void)
#define ER_SP_JVM_LIB_NOT_FOUND
int jsp_server_port(void)
char * strdup(const char *str)
#define JVM_NewObjectArray(ENV, LENGTH, ELEMENTCLASS, INITIALCLASS)
jint(* CREATE_VM_FUNC)(JavaVM **, void **, void *)