⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jk_worker_jni.c

📁 Tomcat 4.1与WebServer集成组件的源代码包.
💻 C
📖 第 1 页 / 共 2 页
字号:
/* ========================================================================= * *                                                                           * *                 The Apache Software License,  Version 1.1                 * *                                                                           * *          Copyright (c) 1999-2002 The Apache Software Foundation.          * *                           All rights reserved.                            * *                                                                           * * ========================================================================= * *                                                                           * * Redistribution and use in source and binary forms,  with or without modi- * * fication, are permitted provided that the following conditions are met:   * *                                                                           * * 1. Redistributions of source code  must retain the above copyright notice * *    notice, this list of conditions and the following disclaimer.          * *                                                                           * * 2. Redistributions  in binary  form  must  reproduce the  above copyright * *    notice,  this list of conditions  and the following  disclaimer in the * *    documentation and/or other materials provided with the distribution.   * *                                                                           * * 3. The end-user documentation  included with the redistribution,  if any, * *    must include the following acknowlegement:                             * *                                                                           * *       "This product includes  software developed  by the Apache  Software * *        Foundation <http://www.apache.org/>."                              * *                                                                           * *    Alternately, this acknowlegement may appear in the software itself, if * *    and wherever such third-party acknowlegements normally appear.         * *                                                                           * * 4. The names  "The  Jakarta  Project",  "Jk",  and  "Apache  Software     * *    Foundation"  must not be used  to endorse or promote  products derived * *    from this  software without  prior  written  permission.  For  written * *    permission, please contact <apache@apache.org>.                        * *                                                                           * * 5. Products derived from this software may not be called "Apache" nor may * *    "Apache" appear in their names without prior written permission of the * *    Apache Software Foundation.                                            * *                                                                           * * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES * * INCLUDING, BUT NOT LIMITED TO,  THE IMPLIED WARRANTIES OF MERCHANTABILITY * * AND FITNESS FOR  A PARTICULAR PURPOSE  ARE DISCLAIMED.  IN NO EVENT SHALL * * THE APACHE  SOFTWARE  FOUNDATION OR  ITS CONTRIBUTORS  BE LIABLE  FOR ANY * * DIRECT,  INDIRECT,   INCIDENTAL,  SPECIAL,  EXEMPLARY,  OR  CONSEQUENTIAL * * DAMAGES (INCLUDING,  BUT NOT LIMITED TO,  PROCUREMENT OF SUBSTITUTE GOODS * * OR SERVICES;  LOSS OF USE,  DATA,  OR PROFITS;  OR BUSINESS INTERRUPTION) * * HOWEVER CAUSED AND  ON ANY  THEORY  OF  LIABILITY,  WHETHER IN  CONTRACT, * * STRICT LIABILITY, OR TORT  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * * ANY  WAY  OUT OF  THE  USE OF  THIS  SOFTWARE,  EVEN  IF  ADVISED  OF THE * * POSSIBILITY OF SUCH DAMAGE.                                               * *                                                                           * * ========================================================================= * *                                                                           * * This software  consists of voluntary  contributions made  by many indivi- * * duals on behalf of the  Apache Software Foundation.  For more information * * on the Apache Software Foundation, please see <http://www.apache.org/>.   * *                                                                           * * ========================================================================= *//** * In process JNI worker. It'll call an arbitrary java class's main method * with given parameters and set a pointer to the java vm in the workerEnv. * ( XXX and an optional set method to pass env, workerEnv pointers ) *  * @author:  Gal Shachor <shachor@il.ibm.com> * @author: Costin Manolache */#include "jk_workerEnv.h"#include "jk_env.h"#include "jk_bean.h"#ifdef HAVE_JNI#include "apr_thread_proc.h"#include "jk_vm.h"#include "jk_registry.h"#include <jni.h>extern jint jk_jni_aprImpl_registerNatives(JNIEnv *, jclass);extern int jk_jni_status_code;/* default only, will be  configurable  */#define JAVA_BRIDGE_CLASS_NAME ("org/apache/jk/apr/TomcatStarter")#define JAVA_BRIDGE_CLASS_APRI ("org/apache/jk/apr/AprImpl")/* The class will be executed when the connector is started */#define JK2_WORKER_HOOK_STARTUP     0#define JK2_WORKER_HOOK_INIT        1#define JK2_WORKER_HOOK_CLOSE       2/* The class will be executed when the connector is about to be destroyed */#define JK2_WORKER_HOOK_SHUTDOWN    3struct jni_worker_data {    jclass      jk_java_bridge_class;    jclass      jk_java_bridge_apri_class;    jmethodID   jk_main_method;    jmethodID   jk_setout_method;    jmethodID   jk_seterr_method;    char *className;    char *stdout_name;    char *stderr_name;    /* Hack to allow multiple 'options' for the class name */    char **classNameOptions;    char **args;    int nArgs;    int hook;};typedef struct jni_worker_data jni_worker_data_t;/** -------------------- Startup -------------------- *//** Static methods - much easier... */static int jk2_get_method_ids(jk_env_t *env, jni_worker_data_t *p, JNIEnv *jniEnv ){    p->jk_main_method =        (*jniEnv)->GetStaticMethodID(jniEnv, p->jk_java_bridge_class,                                     "main",                                      "([Ljava/lang/String;)V");    if(!p->jk_main_method) {        env->l->jkLog(env, env->l, JK_LOG_EMERG, "Can't find main(String [])\n");         return JK_ERR;    }    /* Only the startup hook can redirect the stdout/stderr */    if (p->hook == JK2_WORKER_HOOK_STARTUP) {        p->jk_setout_method =        (*jniEnv)->GetStaticMethodID(jniEnv, p->jk_java_bridge_apri_class,                                     "setOut",                                      "(Ljava/lang/String;)V");        if(!p->jk_setout_method) {            env->l->jkLog(env, env->l, JK_LOG_EMERG,                           "Can't find AprImpl.setOut(String)");             return JK_ERR;        }        p->jk_seterr_method =        (*jniEnv)->GetStaticMethodID(jniEnv, p->jk_java_bridge_apri_class,                                     "setErr",                                      "(Ljava/lang/String;)V");        if(!p->jk_seterr_method) {            env->l->jkLog(env, env->l, JK_LOG_EMERG,                           "Can't find AprImpl.setErr(String)\n");             return JK_ERR;        }    }    return JK_OK;}static int JK_METHOD jk2_jni_worker_service(jk_env_t *env,                                            jk_worker_t *w,                                            jk_ws_service_t *s){    return JK_ERR;}static int JK_METHOD jk2_jni_worker_setProperty(jk_env_t *env, jk_bean_t *mbean,                                                char *name, void *valueP){    jk_worker_t *_this=mbean->object;    char *value=valueP;    jni_worker_data_t *jniWorker;    int mem_config = 0;        if(! _this || ! _this->worker_private) {        env->l->jkLog(env, env->l, JK_LOG_ERROR,                      "In validate, assert failed - invalid parameters\n");        return JK_ERR;    }    jniWorker = _this->worker_private;    if (strcmp(mbean->name, "worker.jni:onStartup") == 0)        jniWorker->hook = JK2_WORKER_HOOK_STARTUP;    else if (strncmp(mbean->name, "worker.jni:onInit",        sizeof("worker.jni:onInit") -1)== 0)        jniWorker->hook = JK2_WORKER_HOOK_INIT;    else if (strncmp(mbean->name, "worker.jni:onClose",        sizeof("worker.jni:onClose") -1)== 0)        jniWorker->hook = JK2_WORKER_HOOK_CLOSE;    else if (strcmp(mbean->name, "worker.jni:onShutdown") == 0)        jniWorker->hook = JK2_WORKER_HOOK_SHUTDOWN;    if( strcmp( name, "stdout" )==0 ) {        jniWorker->stdout_name = value;    } else if( strcmp( name, "stderr" )==0 ) {        jniWorker->stderr_name = value;    } else if( strcmp( name, "class" )==0 ) {        if( jniWorker->className != NULL ) {            int i;            for( i=0; i<4; i++ ) {                if( jniWorker->classNameOptions[i]==NULL ) {                    jniWorker->classNameOptions[i]=value;                }            }         } else {            jniWorker->className = value;        }    } else if( strcmp( name, "ARG" )==0 ) {        jniWorker->args[jniWorker->nArgs]=value;        jniWorker->nArgs++;    } else {        return JK_ERR;    }    return JK_OK;}static int JK_METHOD jk2_jni_worker_init(jk_env_t *env, jk_bean_t *bean){    jk_worker_t *_this=bean->object;    jni_worker_data_t *jniWorker;    JNIEnv *jniEnv;    jstring cmd_line = NULL;    jstring stdout_name = NULL;    jstring stderr_name = NULL;    jint rc = 0;    char *str_config = NULL;    jk_map_t *props;    jk_vm_t *vm;    jclass jstringClass;    jarray jargs;    int i=0;    if(! _this || ! _this->worker_private) {        env->l->jkLog(env, env->l, JK_LOG_EMERG,                      "In init, assert failed - invalid parameters\n");        return JK_ERR;    }    vm = _this->workerEnv->vm;    if( vm == NULL ) {        env->l->jkLog(env, env->l, JK_LOG_ERROR,                      "workerJni.init() No VM found\n");        return JK_ERR;    }        /* Allow only the first child to execute the worker */    if (_this->workerEnv->childId != 0) {        env->l->jkLog(env, env->l, JK_LOG_INFO,                      "workerJni.Init() Skipping initialization for the %d %d\n",                      _this->workerEnv->childId,                       _this->workerEnv->childProcessId);        return JK_ERR;    }    props=_this->workerEnv->initData;    jniWorker = _this->worker_private;        if( jniWorker->className==NULL )        jniWorker->className=JAVA_BRIDGE_CLASS_NAME;        env->l->jkLog(env, env->l, JK_LOG_INFO,                  "jni.validate() class= %s \n",                  jniWorker->className);    jniEnv = (JNIEnv *)vm->attach( env, vm );    if( jniEnv==NULL ) {        env->l->jkLog(env, env->l, JK_LOG_ERROR,                      "workerJni.init() Can't attach to VM\n");        return JK_ERR;    }    if(jniWorker->stdout_name) {        stdout_name = (*jniEnv)->NewStringUTF(jniEnv, jniWorker->stdout_name);    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -