costin      02/04/15 16:52:41

  Modified:    jk/native2/common jk_channel_jni.c
  Log:
  Use a more consistent and flexible mechanism for callbacks from C to java.
  Also 'consolidate' all native code in one class, to simplify loading of the .so
  and avoid ClassLoader problems ( yes, there are problems even in native code ).
  
  Revision  Changes    Path
  1.9       +56 -37    jakarta-tomcat-connectors/jk/native2/common/jk_channel_jni.c
  
  Index: jk_channel_jni.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_channel_jni.c,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- jk_channel_jni.c  12 Apr 2002 23:07:11 -0000      1.8
  +++ jk_channel_jni.c  15 Apr 2002 23:52:41 -0000      1.9
  @@ -72,7 +72,7 @@
   #include <jni.h>
   
   /* default only, is configurable now */
  -#define JAVA_BRIDGE_CLASS_NAME ("org/apache/jk/common/ChannelJni")
  +#define JAVA_BRIDGE_CLASS_NAME ("org/apache/jk/apr/AprImpl")
   
   
   /** Information specific for the socket channel
  @@ -94,8 +94,8 @@
       char *carray;
       int arrayLen;
       
  -    jobject epJ;
  -    jobject msgJ;
  +    jobject jniJavaContext;
  +/*     jobject msgJ; */
   } jk_ch_jni_ep_private_t;
   
   
  @@ -126,6 +126,7 @@
       jk_ch_jni_ep_private_t *epData;
       jmethodID jmethod;
       jobject jobj;
  +    jstring jstr;
   
       jk_channel_jni_private_t *jniCh=_this->_privatePtr;
   
  @@ -176,44 +177,56 @@
           return JK_FALSE;
       }
   
  +
  +    /* Interface to the callback mechansim. The idea is simple ( is it ? ) - we
  +       use a similar pattern with java, trying to do as little as possible
  +       in C and pass minimal information to allow this.
  +
  +       The pattern used for callback works for our message forwarding but also for
  +       other things - like singnals, etc
  +    */
  +
       jmethod=(*jniEnv)->GetStaticMethodID(jniEnv, jniCh->jniBridge,
  -                 "createEndpointStatic", "(JJ)Lorg/apache/jk/core/MsgContext;");
  +                 "createJavaContext", "(Ljava/lang/String;J)Ljava/lang/Object;");
       if( jmethod == NULL ) {
           env->l->jkLog(env, env->l, JK_LOG_INFO,
  -                      "channel_jni.open() can't find createEndpointStatic\n"); 
  +                      "channel_jni.open() can't find createJavaContext\n"); 
           return JK_FALSE;
       }
  +    
  +    jstr=(*jniEnv)->NewStringUTF(jniEnv, "channelJni" );
  +    
       jobj=(*jniEnv)->CallStaticObjectMethod( jniEnv, jniCh->jniBridge,
  -                                                   jmethod,
  -                                                   (jlong)(long)(void *)env,
  -                                               (jlong)(long)(void *)endpoint );
  -    epData->epJ=(*jniEnv)->NewGlobalRef( jniEnv, jobj );
  +                                            jmethod,
  +                                            jstr, 
  +                                            (jlong)(long)(void *)endpoint );
   
  -    jmethod=(*jniEnv)->GetStaticMethodID(jniEnv, jniCh->jniBridge,
  -                                         "createMessage",
  -                                         "()Lorg/apache/jk/common/MsgAjp;");
  -    if( jmethod == NULL ) {
  -        env->l->jkLog(env, env->l, JK_LOG_INFO,
  -                      "channel_jni.open() can't find createMessage\n"); 
  +    if( jobj  == NULL ) {
  +        env->l->jkLog(env, env->l, JK_LOG_ERROR,
  +                      "channel_jni.open() Can't create java context\n" ); 
  +        epData->jniJavaContext=NULL;
           return JK_FALSE;
       }
  -    jobj=(*jniEnv)->CallStaticObjectMethod( jniEnv, jniCh->jniBridge,
  -                                            jmethod );
  -    epData->msgJ=(*jniEnv)->NewGlobalRef( jniEnv, jobj );
  +    epData->jniJavaContext=(*jniEnv)->NewGlobalRef( jniEnv, jobj );
  +
  +    env->l->jkLog(env, env->l, JK_LOG_INFO,
  +                  "channel_jni.open() Got ep %p %p\n", jobj, epData->jniJavaContext 
); 
   
       /* XXX Destroy them in close */
       
       jmethod=(*jniEnv)->GetStaticMethodID(jniEnv, jniCh->jniBridge,
                                            "getBuffer",
  -                                         "(Lorg/apache/jk/common/MsgAjp;)[B");
  +                                         "(Ljava/lang/Object;I)[B");
       if( jmethod == NULL ) {
           env->l->jkLog(env, env->l, JK_LOG_INFO,
                         "channel_jni.open() can't find getBuffer\n"); 
           return JK_FALSE;
       }
  +
       epData->jarray=(*jniEnv)->CallStaticObjectMethod( jniEnv, jniCh->jniBridge,
  -                                                   jmethod, epData->msgJ );
  -    /*epData->jarray=(*jniEnv)->NewByteArray(jniEnv, 10000 ); */
  +                                                      jmethod,
  +                                                      epData->jniJavaContext, 0);
  +
       epData->jarray=(*jniEnv)->NewGlobalRef( jniEnv, epData->jarray );
   
       epData->arrayLen = (*jniEnv)->GetArrayLength( jniEnv, epData->jarray );
  @@ -225,13 +238,12 @@
   
       jniCh->writeMethod =
           (*jniEnv)->GetStaticMethodID(jniEnv, jniCh->jniBridge,
  -                                     "receiveRequest",
  -                                     "(JJLorg/apache/jk/core/MsgContext;"
  -                                     "Lorg/apache/jk/common/MsgAjp;)I");
  +                                     "jniInvoke",
  +                                     "(JLjava/lang/Object;)I");
       
       if( jniCh->writeMethod == NULL ) {
        env->l->jkLog(env, env->l, JK_LOG_EMERG,
  -                      "channel_jni.open() can't find write method\n"); 
  +                      "channel_jni.open() can't find jniInvoke\n"); 
           return JK_FALSE;
       }
   
  @@ -257,7 +269,7 @@
       epData=(jk_ch_jni_ep_private_t *)endpoint->channelData;
       
       /* (*jniEnv)->DeleteGlobalRef( jniEnv, epData->msgJ ); */
  -    /*     (*jniEnv)->DeleteGlobalRef( jniEnv, epData->epJ ); */
  +    /*     (*jniEnv)->DeleteGlobalRef( jniEnv, epData->jniJavaContext ); */
       
       return JK_TRUE;
   
  @@ -291,17 +303,25 @@
       jk_ch_jni_ep_private_t *epData=
           (jk_ch_jni_ep_private_t *)endpoint->channelData;;
   
  -    env->l->jkLog(env, env->l, JK_LOG_INFO,"channel_jni.send()\n" ); 
  +    env->l->jkLog(env, env->l, JK_LOG_INFO,"channel_jni.send() %p\n", epData ); 
   
       if( epData == NULL ) {
           jk2_channel_jni_open( env, _this, endpoint );
           epData=(jk_ch_jni_ep_private_t *)endpoint->channelData;
       }
   
  +    if( epData->jniJavaContext == NULL ) {
  +        env->l->jkLog(env, env->l, JK_LOG_ERROR,"channel_jni.send() no java 
context\n" ); 
  +        
  +        return JK_FALSE;
  +    }
  +
       msg->end( env, msg );
       len=msg->len;
       b=msg->buf;
   
  +    env->l->jkLog(env, env->l, JK_LOG_INFO,"channel_jni.send() (1) %p\n", epData ); 
  +
       jniEnv=NULL; /* epData->jniEnv; */
       jbuf=epData->jarray;
   
  @@ -345,17 +365,14 @@
       (*jniEnv)->ReleaseByteArrayElements(jniEnv, jbuf, nbuf, 0);
       
       env->l->jkLog(env, env->l, JK_LOG_INFO,
  -                  "channel_jni.send() before send %p %p\n",
  -                  (void *)(long)epData->epJ, 
  -                  (void *)(long)epData->msgJ ); 
  -
  +                  "channel_jni.send() before send %p\n",
  +                  (void *)(long)epData->jniJavaContext); 
  +    
       sent=(*jniEnv)->CallStaticIntMethod( jniEnv,
                                            jniCh->jniBridge, 
                                            jniCh->writeMethod,
                                            (jlong)(long)(void *)env,
  -                             (jlong)(long)(void *)endpoint->currentRequest,
  -                                         epData->epJ,
  -                                         epData->msgJ);
  +                                         epData->jniJavaContext );
       env->l->jkLog(env, env->l, JK_LOG_INFO,"channel_jni.send() result %d\n",
                     sent); 
       return JK_TRUE;
  @@ -462,17 +479,19 @@
   
   
   /*
  -  
  +  Called from Java - the 2 pointers are exactly what we passed when we constructed
  +  the endpoint and for the request.
    */
   int jk2_channel_jni_javaSendPacket(JNIEnv *jniEnv, jobject o,
  -                                   jlong envJ, jlong eP, jlong s,
  +                                   jlong envJ, jlong eP,
                                      jbyteArray data, jint dataLen)
   {
       /* [V] Convert indirectly from jlong -> int -> pointer to shut up gcc */
       /*     I hope it's okay on other compilers and/or machines...         */
  -    jk_ws_service_t *ps = (jk_ws_service_t *)(int)s;
       jk_env_t *env = (jk_env_t *)(long)envJ;
       jk_endpoint_t *e = (jk_endpoint_t *)(long)eP;
  +    jk_ws_service_t *ps = e->currentRequest;
  +
       int cnt=0;
       jint rc = -1;
       jboolean iscommit;
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to