jk_jni_worker.c
来自「Tomcat 4.1与WebServer集成组件的源代码包.」· C语言 代码 · 共 1,268 行 · 第 1/3 页
C
1,268 行
p->tomcat_classpath = jk_pool_strdup(&p->p, str_config); } if(!p->tomcat_classpath) { jk_log(l, JK_LOG_EMERG, "Fail-> no classpath\n"); return JK_FALSE; } if(jk_get_worker_bridge_type(props, p->name, (unsigned int *)&btype)) { p->bridge_type = btype; } if(jk_get_worker_jvm_path(props, p->name, &str_config)) { p->jvm_dll_path = jk_pool_strdup(&p->p, str_config); } if(!p->jvm_dll_path || !jk_file_exists(p->jvm_dll_path)) { jk_log(l, JK_LOG_EMERG, "Fail-> no jvm_dll_path\n"); return JK_FALSE; } if(jk_get_worker_cmd_line(props, p->name, &str_config)) { p->tomcat_cmd_line = jk_pool_strdup(&p->p, str_config); } if(jk_get_worker_stdout(props, p->name, &str_config)) { p->stdout_name = jk_pool_strdup(&p->p, str_config); } if(jk_get_worker_stderr(props, p->name, &str_config)) { p->stderr_name = jk_pool_strdup(&p->p, str_config); } if(jk_get_worker_sysprops(props, p->name, &str_config)) { p->sysprops = jk_parse_sysprops(&p->p, str_config); }#ifdef JNI_VERSION_1_2 if(jk_get_worker_str_prop(props, p->name, "java2opts", &str_config)) { /* jk_log(l, JK_LOG_DEBUG, "Got opts: %s\n", str_config); */ p->java2opts = jk_parse_sysprops(&p->p, str_config); } if(jk_get_worker_int_prop(props, p->name, "java2lax", &mem_config)) { p->java2lax = mem_config ? JK_TRUE : JK_FALSE; }#endif if(jk_get_worker_libpath(props, p->name, &str_config)) { jk_append_libpath(&p->p, str_config); } if(!load_jvm_dll(p, l)) { jk_log(l, JK_LOG_EMERG, "Fail-> can't load jvm dll\n"); /* [V] no detach needed here */ return JK_FALSE; } if(!open_jvm(p, &env, l)) { jk_log(l, JK_LOG_EMERG, "Fail-> can't open jvm\n"); /* [V] no detach needed here */ return JK_FALSE; } if(!get_bridge_object(p, env, l)) { jk_log(l, JK_LOG_EMERG, "Fail-> can't get bridge object\n"); /* [V] the detach here may segfault on 1.1 JVM... */ detach_from_jvm(p, l); return JK_FALSE; } if(!get_method_ids(p, env, l)) { jk_log(l, JK_LOG_EMERG, "Fail-> can't get method ids\n"); /* [V] the detach here may segfault on 1.1 JVM... */ detach_from_jvm(p, l); return JK_FALSE; } p->was_verified = JK_TRUE; p->tmp_env = env; jk_log(l, JK_LOG_DEBUG, "Done validate\n"); return JK_TRUE;}static int JK_METHOD init(jk_worker_t *pThis, jk_map_t *props, jk_worker_env_t *we, jk_logger_t *l){ jni_worker_t *p; JNIEnv *env; jk_log(l, JK_LOG_DEBUG, "Into init\n"); if(! pThis || ! pThis->worker_private) { jk_log(l, JK_LOG_EMERG, "In init, assert failed - invalid parameters\n"); return JK_FALSE; } p = pThis->worker_private; if(p->was_initialized) { jk_log(l, JK_LOG_DEBUG, "init, done (been here!)\n"); return JK_TRUE; } if(!p->jvm || !p->jk_java_bridge_object || !p->jk_service_method || !p->jk_startup_method || !p->jk_shutdown_method) { jk_log(l, JK_LOG_EMERG, "Fail-> worker not set completely\n"); return JK_FALSE; } /* [V] init is called from the same thread that called validate */ /* there is no need to attach to the JVM, just get the env */ /* if(env = attach_to_jvm(p,l)) { */ if((env = p->tmp_env)) { jstring cmd_line = (jstring)NULL; jstring stdout_name = (jstring)NULL; jstring stderr_name = (jstring)NULL; jint rc = 0; /* AS400/BS2000 need EBCDIC to ASCII conversion for JNI */ if(p->tomcat_cmd_line) { cmd_line = (*env)->NewStringUTF(env, strdup_ascii(&p->p, p->tomcat_cmd_line)); } if(p->stdout_name) { stdout_name = (*env)->NewStringUTF(env, strdup_ascii(&p->p, p->stdout_name)); } if(p->stderr_name) { stderr_name = (*env)->NewStringUTF(env, strdup_ascii(&p->p, p->stderr_name)); } jk_log(l, JK_LOG_DEBUG, "In init, calling Tomcat to intialize itself...\n"); rc = (*env)->CallIntMethod(env, p->jk_java_bridge_object, p->jk_startup_method, cmd_line, stdout_name, stderr_name); detach_from_jvm(p, l); if(rc) { p->was_initialized = JK_TRUE; jk_log(l, JK_LOG_DEBUG, "In init, Tomcat initialized OK, done\n"); return JK_TRUE; } else { jk_log(l, JK_LOG_EMERG, "Fail-> could not initialize Tomcat\n"); return JK_FALSE; } } else { jk_log(l, JK_LOG_ERROR, "In init, FIXME: init didn't gen env from validate!\n"); return JK_FALSE; }}static int JK_METHOD get_endpoint(jk_worker_t *pThis, jk_endpoint_t **pend, jk_logger_t *l){ /* [V] This slow, needs replacement */ jni_endpoint_t *p = (jni_endpoint_t *)malloc(sizeof(jni_endpoint_t)); jk_log(l, JK_LOG_DEBUG, "Into get_endpoint\n"); if(!pThis || ! pThis->worker_private || !pend) { jk_log(l, JK_LOG_EMERG, "In get_endpoint, assert failed - invalid parameters\n"); return JK_FALSE; } if(p) { p->attached = JK_FALSE; p->env = NULL; p->worker = pThis->worker_private; p->endpoint.endpoint_private = p; p->endpoint.service = service; p->endpoint.done = done; *pend = &p->endpoint; return JK_TRUE; } else { jk_log(l, JK_LOG_ERROR, "In get_endpoint, could not allocate endpoint\n"); return JK_FALSE; }}static int JK_METHOD destroy(jk_worker_t **pThis, jk_logger_t *l){ jni_worker_t *p; JNIEnv *env; jk_log(l, JK_LOG_DEBUG, "Into destroy\n"); if(!pThis || !*pThis || ! (*pThis)->worker_private) { jk_log(l, JK_LOG_EMERG, "In destroy, assert failed - invalid parameters\n"); return JK_FALSE; } p = (*pThis)->worker_private; if(!p->jvm) { jk_log(l, JK_LOG_DEBUG, "In destroy, JVM not intantiated\n"); return JK_FALSE; } if(!p->jk_java_bridge_object || ! p->jk_shutdown_method) { jk_log(l, JK_LOG_DEBUG, "In destroy, Tomcat not intantiated\n"); return JK_FALSE; } if((env = attach_to_jvm(p,l))) { jk_log(l, JK_LOG_DEBUG, "In destroy, shutting down Tomcat...\n"); (*env)->CallVoidMethod(env, p->jk_java_bridge_object, p->jk_shutdown_method); detach_from_jvm(p, l); } jk_close_pool(&p->p); free(p); jk_log(l, JK_LOG_DEBUG, "Done destroy\n"); return JK_TRUE;}int JK_METHOD jni_worker_factory(jk_worker_t **w, const char *name, jk_logger_t *l){ jni_worker_t *private_data; jk_log(l, JK_LOG_DEBUG, "Into jni_worker_factory\n"); if(!name || !w) { jk_log(l, JK_LOG_EMERG, "In jni_worker_factory, assert failed - invalid parameters\n"); return JK_FALSE; } if(the_singleton_jni_worker) { jk_log(l, JK_LOG_DEBUG, "In jni_worker_factory, instance already created\n"); *w = the_singleton_jni_worker; return JK_TRUE; } private_data = (jni_worker_t *)malloc(sizeof(jni_worker_t )); if(!private_data) { jk_log(l, JK_LOG_ERROR, "In jni_worker_factory, memory allocation error\n"); return JK_FALSE; } jk_open_pool(&private_data->p, private_data->buf, sizeof(jk_pool_atom_t) * TINY_POOL_SIZE); private_data->name = jk_pool_strdup(&private_data->p, name); if(!private_data->name) { jk_log(l, JK_LOG_ERROR, "In jni_worker_factory, memory allocation error\n"); jk_close_pool(&private_data->p); free(private_data); return JK_FALSE; } private_data->was_verified = JK_FALSE; private_data->was_initialized = JK_FALSE; private_data->jvm = NULL; private_data->tmp_env = NULL; private_data->jk_java_bridge_object = (jobject)NULL; private_data->jk_java_bridge_class = (jclass)NULL; private_data->jk_startup_method = (jmethodID)NULL; private_data->jk_service_method = (jmethodID)NULL; private_data->jk_shutdown_method = (jmethodID)NULL; private_data->tomcat_cmd_line = NULL; private_data->tomcat_classpath = NULL; private_data->bridge_type = TC33_BRIDGE_TYPE; private_data->jvm_dll_path = NULL; private_data->tomcat_ms = 0; private_data->tomcat_mx = 0; private_data->sysprops = NULL;#ifdef JNI_VERSION_1_2 private_data->java2opts = NULL; private_data->java2lax = JK_TRUE;#endif private_data->stdout_name = NULL; private_data->stderr_name = NULL; private_data->worker.worker_private = private_data; private_data->worker.validate = validate; private_data->worker.init = init; private_data->worker.get_endpoint = get_endpoint; private_data->worker.destroy = destroy; *w = &private_data->worker; the_singleton_jni_worker = &private_data->worker; jk_log(l, JK_LOG_DEBUG, "Done jni_worker_factory\n"); return JK_TRUE;}static int load_jvm_dll(jni_worker_t *p, jk_logger_t *l){#ifdef WIN32 HINSTANCE hInst = LoadLibrary(p->jvm_dll_path); if(hInst) { (FARPROC)jni_create_java_vm = GetProcAddress(hInst, "JNI_CreateJavaVM"); (FARPROC)jni_get_created_java_vms = GetProcAddress(hInst, "JNI_GetCreatedJavaVMs"); (FARPROC)jni_get_default_java_vm_init_args = GetProcAddress(hInst, "JNI_GetDefaultJavaVMInitArgs"); jk_log(l, JK_LOG_DEBUG, "Loaded all JNI procs\n"); if(jni_create_java_vm && jni_get_default_java_vm_init_args && jni_get_created_java_vms) { return JK_TRUE; } FreeLibrary(hInst); }#elif defined(NETWARE) && !defined(__NOVELL_LIBC__) int javaNlmHandle = FindNLMHandle("JVM"); if (0 == javaNlmHandle) { /* if we didn't get a handle, try to load java and retry getting the */ /* handle */ spawnlp(P_NOWAIT, "JVM.NLM", NULL); ThreadSwitchWithDelay(); javaNlmHandle = FindNLMHandle("JVM"); if (0 == javaNlmHandle) printf("Error loading Java."); } if (0 != javaNlmHandle) { jni_create_java_vm = ImportSymbol(GetNLMHandle(), "JNI_CreateJavaVM"); jni_get_created_java_vms = ImportSymbol(GetNLMHandle(), "JNI_GetCreatedJavaVMs"); jni_get_default_java_vm_init_args = ImportSymbol(GetNLMHandle(), "JNI_GetDefaultJavaVMInitArgs"); } if(jni_create_java_vm && jni_get_default_java_vm_init_args && jni_get_created_java_vms) { return JK_TRUE; }#elif defined(AS400) jk_log(l, JK_LOG_DEBUG, "Direct reference to JNI entry points (no SRVPGM)\n"); jni_create_java_vm = &JNI_CreateJavaVM; jni_get_default_java_vm_init_args = &JNI_GetDefaultJavaVMInitArgs; jni_get_created_java_vms = &JNI_GetCreatedJavaVMs;#else void *handle; jk_log(l, JK_LOG_DEBUG, "Into load_jvm_dll, load %s\n", p->jvm_dll_path); handle = dlopen(p->jvm_dll_path, RTLD_NOW | RTLD_GLOBAL); if(!handle) { jk_log(l, JK_LOG_EMERG, "Can't load native library %s : %s\n", p->jvm_dll_path, dlerror()); } else { jni_create_java_vm = dlsym(handle, "JNI_CreateJavaVM"); jni_get_default_java_vm_init_args = dlsym(handle, "JNI_GetDefaultJavaVMInitArgs"); jni_get_created_java_vms = dlsym(handle, "JNI_GetCreatedJavaVMs"); if(jni_create_java_vm && jni_get_default_java_vm_init_args && jni_get_created_java_vms) { jk_log(l, JK_LOG_DEBUG, "In load_jvm_dll, symbols resolved, done\n"); return JK_TRUE; } jk_log(l, JK_LOG_EMERG, "Can't resolve JNI_CreateJavaVM or JNI_GetDefaultJavaVMInitArgs\n"); dlclose(handle); }#endif return JK_FALSE;}static int open_jvm(jni_worker_t *p, JNIEnv **env, jk_logger_t *l){#ifdef JNI_VERSION_1_2 int jvm_version = detect_jvm_version(l); switch(jvm_version) { case JNI_VERSION_1_1: return open_jvm1(p, env, l); case JNI_VERSION_1_2: return open_jvm2(p, env, l); default: return JK_FALSE; }#else /* [V] Make sure this is _really_ visible */ #warning ------------------------------------------------------- #warning NO JAVA 2 HEADERS! SUPPORT FOR JAVA 2 FEATURES DISABLED #warning ------------------------------------------------------- return open_jvm1(p, env, l);#endif}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?