📄 jk_jni_aprimpl.c
字号:
/**/JNIEXPORT jint JNICALL Java_org_apache_jk_apr_AprImpl_jkSetAttribute (JNIEnv *jniEnv, jobject o, jlong xEnv, jlong componentP, jstring nameJ, jstring valueJ ){ jk_env_t *env=(jk_env_t *)(void *)(long)xEnv; jk_bean_t *component=(jk_bean_t *)(void *)(long)componentP; char *name=(char *)(*jniEnv)->GetStringUTFChars(jniEnv, nameJ, 0); char *value=(char *)(*jniEnv)->GetStringUTFChars(jniEnv, valueJ, 0); int rc=JK_OK; /* XXX need to find a way how to set this to channel:jni component * instead of global variable. */ if(env == NULL || component == NULL) { if (strcmp(name, "channel:jni") == 0) { if (strcmp(value, "starting") == 0) jk_jni_status_code = JNI_TOMCAT_STARTING; else if (strcmp(value, "done") == 0) jk_jni_status_code = JNI_TOMCAT_STARTED; } } else { if( component->setAttribute!=NULL ) { rc=component->setAttribute( env, component, name, component->pool->pstrdup( env, component->pool, value ) ); } } (*jniEnv)->ReleaseStringUTFChars(jniEnv, nameJ, name); (*jniEnv)->ReleaseStringUTFChars(jniEnv, valueJ, value); return rc;}/**/JNIEXPORT jint JNICALL Java_org_apache_jk_apr_AprImpl_jkInit (JNIEnv *jniEnv, jobject o, jlong xEnv, jlong componentP ){ jk_env_t *env=(jk_env_t *)(void *)(long)xEnv; jk_bean_t *component=(jk_bean_t *)(void *)(long)componentP; int rc; if( component->init ==NULL ) return JK_OK; rc=component->init( env, component ); return rc;}/**/JNIEXPORT jint JNICALL Java_org_apache_jk_apr_AprImpl_jkDestroy (JNIEnv *jniEnv, jobject o, jlong xEnv, jlong componentP ){ jk_env_t *env=(jk_env_t *)(void *)(long)xEnv; jk_bean_t *component=(jk_bean_t *)(void *)(long)componentP; int rc; if( component->destroy ==NULL ) return JK_OK; rc=component->destroy( env, component ); /* XXX component->pool->reset( env, component->pool ); */ return rc;}/**/JNIEXPORT jstring JNICALL Java_org_apache_jk_apr_AprImpl_jkGetAttribute (JNIEnv *jniEnv, jobject o, jlong xEnv, jlong componentP, jstring nameJ){ jk_env_t *env=(jk_env_t *)(void *)(long)xEnv; jk_bean_t *component=(jk_bean_t *)(void *)(long)componentP; char *name=(char *)(*jniEnv)->GetStringUTFChars(jniEnv, nameJ, 0); char *value; jstring valueJ=NULL; if( component->getAttribute !=NULL ){ value=component->getAttribute( env, component, name ); if( value!=NULL ) { valueJ=(*jniEnv)->NewStringUTF(jniEnv, value); } } (*jniEnv)->ReleaseStringUTFChars(jniEnv, nameJ, name); return valueJ;}/**/JNIEXPORT jint JNICALL Java_org_apache_jk_apr_AprImpl_jkInvoke (JNIEnv *jniEnv, jobject o, jlong envJ, jlong componentP, jlong endpointP, jint code, jbyteArray data, jint off, jint len, jint raw){ jk_env_t *env = (jk_env_t *)(void *)(long)envJ; jk_bean_t *compCtx=(jk_bean_t *)(void *)(long)endpointP; void *target=(void *)(long)componentP; jk_bean_t *bean=(jk_bean_t *)target; jk_endpoint_t *ep; jbyte *nbuf=NULL; jboolean iscopy; int cnt=0; jint rc = 0; unsigned acc = 0; unsigned char *oldBuf; if( compCtx==NULL || data==NULL ) { env->l->jkLog(env, env->l, JK_LOG_ERROR,"jni.jkInvoke() NPE\n"); return JK_ERR; } ep = compCtx->object; if( ep==NULL || ep->reply==NULL) { env->l->jkLog(env, env->l, JK_LOG_ERROR,"jni.jkInvoke() NPE ep==null\n"); return JK_ERR; } if( arrayAccessMethod == JK_GET_BYTE_ARRAY_ELEMENTS ) { nbuf = (*jniEnv)->GetByteArrayElements(jniEnv, data, &iscopy); if( iscopy ) env->l->jkLog(env, env->l, JK_LOG_INFO, "aprImpl.jkInvoke() get java bytes iscopy %d\n", iscopy); if(nbuf==NULL) { env->l->jkLog(env, env->l, JK_LOG_ERROR, "jkInvoke() NullPointerException 2\n"); return -1; } if( raw==0 ) { ep->reply->reset(env, ep->reply); } oldBuf=ep->reply->buf; ep->reply->buf = (unsigned char *)nbuf; } else if ( arrayAccessMethod == JK_GET_REGION ) { (*jniEnv)->GetByteArrayRegion( jniEnv, data, off, len, (jbyte *)ep->reply->buf ); } if( raw == 0 ) { rc=ep->reply->checkHeader( env, ep->reply, ep ); } else { ep->reply->len = len; ep->reply->pos= off; } /* ep->reply->dump( env, ep->reply ,"MESSAGE"); */ if( rc < 0 ) { env->l->jkLog(env, env->l, JK_LOG_ERROR, "jkInvoke() invalid data\n"); /* we just can't recover, unset recover flag */ if( arrayAccessMethod == JK_GET_BYTE_ARRAY_ELEMENTS ) { (*jniEnv)->ReleaseByteArrayElements(jniEnv, data, ep->reply->buf, 0); ep->reply->buf=oldBuf; } return JK_ERR; } if( bean->debug > 0 ) env->l->jkLog(env, env->l, JK_LOG_INFO, "jkInvoke() component dispatch %d %d \n", rc, code ); if( bean->invoke != NULL ) { env->l->jkLog(env, env->l, JK_LOG_INFO, "jkInvoke() invoke %#lx \n", bean->invoke ); rc=bean->invoke( env, bean, ep, code, ep->reply, raw ); } else { /* NOT USED. Backward compat for AJP13 messages, where the code is used to locate a handler. Deprecated, use the invoke() method ! */ env->l->jkLog(env, env->l, JK_LOG_INFO, "jkInvoke() component dispatch2 %d %d %#lx\n", rc, code, bean->invoke); rc=workerEnv->dispatch( env, workerEnv, target, ep, code, ep->reply ); } /* Copy back the response, if any */ if( arrayAccessMethod == JK_GET_BYTE_ARRAY_ELEMENTS ) { if( rc == JK_INVOKE_WITH_RESPONSE ) { /* env->l->jkLog(env, env->l, JK_LOG_INFO, */ /* "jkInvoke() release byte array elements %d %d %#lx\n", */ /* ep->reply->pos, ep->reply->len , ep->reply->buf ); */ ep->reply->end( env, ep->reply ); (*jniEnv)->ReleaseByteArrayElements(jniEnv, data, nbuf, JNI_ABORT ); rc=JK_OK; } else { (*jniEnv)->ReleaseByteArrayElements(jniEnv, data, nbuf, 0); } ep->reply->buf=oldBuf; } else if ( arrayAccessMethod == JK_GET_REGION ) { if( rc == JK_INVOKE_WITH_RESPONSE ) { /*env->l->jkLog(env, env->l, JK_LOG_INFO, */ /* "jkInvoke() release %d %d %#lx\n", */ /* ep->reply->pos, ep->reply->len , ep->reply->buf ); */ ep->reply->end( env, ep->reply ); (*jniEnv)->SetByteArrayRegion( jniEnv, data, 0, ep->reply->len, (jbyte *)ep->reply->buf ); rc=JK_OK; } } if( (*jniEnv)->ExceptionCheck( jniEnv ) ) { env->l->jkLog(env, env->l, JK_LOG_INFO, "jkInvoke() component dispatch %d %d %#lx\n", rc, code, bean->invoke); (*jniEnv)->ExceptionDescribe( jniEnv ); /* Not needed if Describe is used. (*jniEnv)->ExceptionClear( jniEnv ) */ } return rc;}static JNINativeMethod org_apache_jk_apr_AprImpl_native_methods[] = { { "initialize", "()I", Java_org_apache_jk_apr_AprImpl_initialize }, { "terminate", "()I", Java_org_apache_jk_apr_AprImpl_terminate }, { "getJkEnv", "()J", Java_org_apache_jk_apr_AprImpl_getJkEnv }, { "releaseJkEnv", "(J)V", Java_org_apache_jk_apr_AprImpl_releaseJkEnv }, { "getJkHandler", "(JLjava/lang/String;)J", Java_org_apache_jk_apr_AprImpl_getJkHandler }, { "createJkHandler", "(JLjava/lang/String;)J", Java_org_apache_jk_apr_AprImpl_createJkHandler }, { "jkSetAttribute", "(JJLjava/lang/String;Ljava/lang/String;)I", Java_org_apache_jk_apr_AprImpl_jkSetAttribute }, { "jkGetAttribute", "(JJLjava/lang/String;)Ljava/lang/String;", Java_org_apache_jk_apr_AprImpl_jkGetAttribute }, { "jkInit", "(JJ)I", Java_org_apache_jk_apr_AprImpl_jkInit }, { "jkDestroy", "(JJ)I", Java_org_apache_jk_apr_AprImpl_jkDestroy }, { "jkInvoke", "(JJJI[BIII)I", Java_org_apache_jk_apr_AprImpl_jkInvoke }, { "jkRecycle", "(JJ)V", Java_org_apache_jk_apr_AprImpl_jkRecycle },};/* Register Native methods returning the total number of native functions*/jint jk_jni_aprImpl_registerNatives(JNIEnv *jniEnv, jclass bridgeClass){ return (*jniEnv)->RegisterNatives(jniEnv, bridgeClass, org_apache_jk_apr_AprImpl_native_methods, sizeof(org_apache_jk_apr_AprImpl_native_methods) / sizeof(JNINativeMethod));}#endif /* HAVE_JNI */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -