📄 java.c
字号:
pval *object = property_reference->object; zend_overloaded_element *function_name = (zend_overloaded_element *) property_reference->elements_list->tail->data; int arg_count = ZEND_NUM_ARGS(); jlong result = 0; pval **arguments = (pval **) emalloc(sizeof(pval *)*arg_count); getParametersArray(ht, arg_count, arguments); if (!JG(jenv)) jvm_create(TSRMLS_C); if (!JG(jenv)) return; jenv = JG(jenv); if (!strcmp("java", Z_STRVAL(function_name->element))) { /* construct a Java object: First argument is the class name. Any additional arguments will be treated as constructor parameters. */ jmethodID co = (*jenv)->GetMethodID(jenv, JG(reflect_class), "CreateObject", "(Ljava/lang/String;[Ljava/lang/Object;J)V"); jstring className; result = (jlong)(long)object; if (ZEND_NUM_ARGS() < 1) { php_error(E_ERROR, "Missing classname in new Java() call"); return; } className=(*jenv)->NewStringUTF(jenv, Z_STRVAL_P(arguments[0])); (*jenv)->CallVoidMethod(jenv, JG(php_reflect), co, className, _java_makeArray(arg_count-1, arguments+1 TSRMLS_CC), result); (*jenv)->DeleteLocalRef(jenv, className); } else { pval **handle; int type; jobject obj; jstring method; /* invoke a method on the given object */ jmethodID invoke = (*jenv)->GetMethodID(jenv, JG(reflect_class), "Invoke", "(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;J)V"); zend_hash_index_find(Z_OBJPROP_P(object), 0, (void**) &handle); obj = zend_list_find(Z_LVAL_PP(handle), &type); method = (*jenv)->NewStringUTF(jenv, Z_STRVAL(function_name->element)); result = (jlong)(long)return_value; (*jenv)->CallVoidMethod(jenv, JG(php_reflect), invoke, obj, method, _java_makeArray(arg_count, arguments TSRMLS_CC), result); (*jenv)->DeleteLocalRef(jenv, method); } efree(arguments); pval_destructor(&function_name->element); checkError((pval*)(long)result);}/* }}} *//***************************************************************************//* {{{ proto object java_last_exception_get(void) Get last Java exception */PHP_FUNCTION(java_last_exception_get){ jlong result = 0; jmethodID lastEx; if (ZEND_NUM_ARGS()!=0) WRONG_PARAM_COUNT; result = (jlong)(long)return_value; lastEx = (*JG(jenv))->GetMethodID(JG(jenv), JG(reflect_class), "lastException", "(J)V"); (*JG(jenv))->CallVoidMethod(JG(jenv), JG(php_reflect), lastEx, result);}/* }}} *//***************************************************************************//* {{{ proto void java_last_exception_clear(void) Clear last java extension */PHP_FUNCTION(java_last_exception_clear){ jlong result = 0; jmethodID clearEx; if (ZEND_NUM_ARGS()!=0) WRONG_PARAM_COUNT; result = (jlong)(long)return_value; clearEx = (*JG(jenv))->GetMethodID(JG(jenv), JG(reflect_class), "clearException", "()V"); (*JG(jenv))->CallVoidMethod(JG(jenv), JG(php_reflect), clearEx);}/* }}} *//***************************************************************************//* {{{ _java_getset_property */static pval _java_getset_property (zend_property_reference *property_reference, jobjectArray value TSRMLS_DC){ pval presult; jlong result = 0; pval **pobject; jobject obj; int type; /* get the property name */ zend_llist_element *element = property_reference->elements_list->head; zend_overloaded_element *property=(zend_overloaded_element *)element->data; jstring propName; JNIEnv *jenv; jenv = JG(jenv); propName = (*jenv)->NewStringUTF(jenv, Z_STRVAL(property->element)); /* get the object */ zend_hash_index_find(Z_OBJPROP_P(property_reference->object), 0, (void **) &pobject); obj = zend_list_find(Z_LVAL_PP(pobject), &type); result = (jlong)(long) &presult; Z_TYPE(presult) = IS_NULL; if (!obj || (type!=le_jobject)) { php_error(E_ERROR, "Attempt to access a Java property on a non-Java object"); } else { /* invoke the method */ jmethodID gsp = (*jenv)->GetMethodID(jenv, JG(reflect_class), "GetSetProp", "(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;J)V"); (*jenv)->CallVoidMethod (jenv, JG(php_reflect), gsp, obj, propName, value, result); } (*jenv)->DeleteLocalRef(jenv, propName); pval_destructor(&property->element); return presult;}/* }}} *//* {{{ java_get_property_handler */pval java_get_property_handler(zend_property_reference *property_reference){ pval presult; TSRMLS_FETCH(); presult = _java_getset_property(property_reference, 0 TSRMLS_CC); checkError(&presult); return presult;}/* }}} *//* {{{ java_set_property_handler */int java_set_property_handler(zend_property_reference *property_reference, pval *value){ pval presult; TSRMLS_FETCH(); presult = _java_getset_property(property_reference, _java_makeArray(1, &value TSRMLS_CC) TSRMLS_CC); return checkError(&presult) ? FAILURE : SUCCESS;}/* }}} *//***************************************************************************//* {{{ _php_java_destructor */static void _php_java_destructor(zend_rsrc_list_entry *rsrc TSRMLS_DC){ void *jobject = (void *)rsrc->ptr; if (JG(jenv)) (*JG(jenv))->DeleteGlobalRef(JG(jenv), jobject);}/* }}} *//* {{{ alloc_java_globals_ctor */static void alloc_java_globals_ctor(zend_java_globals *java_globals TSRMLS_DC){ memset(java_globals, 0, sizeof(zend_java_globals));}/* }}} *//* {{{ PHP_MINIT_FUNCTION */PHP_MINIT_FUNCTION(java){ INIT_OVERLOADED_CLASS_ENTRY(java_class_entry, "java", NULL, java_call_function_handler, java_get_property_handler, java_set_property_handler); zend_register_internal_class(&java_class_entry TSRMLS_CC); le_jobject = zend_register_list_destructors_ex(_php_java_destructor, NULL, "java", module_number); REGISTER_INI_ENTRIES(); if (!classpath) classpath = getenv("CLASSPATH"); if (!libpath) { libpath=PG(extension_dir); } ZEND_INIT_MODULE_GLOBALS(java, alloc_java_globals_ctor, NULL); return SUCCESS;}/* }}} *//* {{{ PHP_MSHUTDOWN_FUNCTION */PHP_MSHUTDOWN_FUNCTION(java) { UNREGISTER_INI_ENTRIES(); if (JG(jvm)) jvm_destroy(TSRMLS_C); return SUCCESS;}/* }}} */function_entry java_functions[] = { PHP_FE(java_last_exception_get, NULL) PHP_FE(java_last_exception_clear, NULL) {NULL, NULL, NULL}};static PHP_MINFO_FUNCTION(java) { DISPLAY_INI_ENTRIES();}zend_module_entry java_module_entry = { STANDARD_MODULE_HEADER, "java", java_functions, PHP_MINIT(java), PHP_MSHUTDOWN(java), NULL, NULL, PHP_MINFO(java), NO_VERSION_YET, STANDARD_MODULE_PROPERTIES};ZEND_GET_MODULE(java)/***************************************************************************//* {{{ Java_net_php_reflect_setResultFromString */JNIEXPORT void JNICALL Java_net_php_reflect_setResultFromString (JNIEnv *jenv, jclass self, jlong result, jbyteArray jvalue){ jboolean isCopy; jbyte *value = (*jenv)->GetByteArrayElements(jenv, jvalue, &isCopy); pval *presult = (pval*)(long)result; Z_TYPE_P(presult)=IS_STRING; Z_STRLEN_P(presult)=(*jenv)->GetArrayLength(jenv, jvalue); Z_STRVAL_P(presult)=emalloc(Z_STRLEN_P(presult)+1); memcpy(Z_STRVAL_P(presult), value, Z_STRLEN_P(presult)); Z_STRVAL_P(presult)[Z_STRLEN_P(presult)]=0; if (isCopy) (*jenv)->ReleaseByteArrayElements(jenv, jvalue, value, 0);}/* }}} *//* {{{ Java_net_php_reflect_setResultFromLong */JNIEXPORT void JNICALL Java_net_php_reflect_setResultFromLong (JNIEnv *jenv, jclass self, jlong result, jlong value){ pval *presult = (pval*)(long)result; Z_TYPE_P(presult)=IS_LONG; Z_LVAL_P(presult)=(long)value;}/* }}} *//* {{{ Java_net_php_reflect_setResultFromDouble */JNIEXPORT void JNICALL Java_net_php_reflect_setResultFromDouble (JNIEnv *jenv, jclass self, jlong result, jdouble value){ pval *presult = (pval*)(long)result; Z_TYPE_P(presult)=IS_DOUBLE; Z_DVAL_P(presult)=value;}/* }}} *//* {{{ Java_net_php_reflect_setResultFromBoolean */JNIEXPORT void JNICALL Java_net_php_reflect_setResultFromBoolean (JNIEnv *jenv, jclass self, jlong result, jboolean value){ pval *presult = (pval*)(long)result; Z_TYPE_P(presult)=IS_BOOL; Z_LVAL_P(presult)=value;}/* }}} *//* {{{ Java_net_php_reflect_setResultFromObject */JNIEXPORT void JNICALL Java_net_php_reflect_setResultFromObject (JNIEnv *jenv, jclass self, jlong result, jobject value){ /* wrapper the java object in a pval object */ pval *presult = (pval*)(long)result; pval *handle; TSRMLS_FETCH(); if (Z_TYPE_P(presult) != IS_OBJECT) { object_init_ex(presult, &java_class_entry); presult->is_ref=1; presult->refcount=1; } ALLOC_ZVAL(handle); Z_TYPE_P(handle) = IS_LONG; Z_LVAL_P(handle) = zend_list_insert((*jenv)->NewGlobalRef(jenv, value), le_jobject); pval_copy_constructor(handle); INIT_PZVAL(handle); zend_hash_index_update(Z_OBJPROP_P(presult), 0, &handle, sizeof(pval *), NULL);}/* }}} *//* {{{ Java_net_php_reflect_setResultFromArray */JNIEXPORT void JNICALL Java_net_php_reflect_setResultFromArray (JNIEnv *jenv, jclass self, jlong result){ array_init( (pval*)(long)result );}/* }}} *//* {{{ Java_net_php_reflect_nextElement */JNIEXPORT jlong JNICALL Java_net_php_reflect_nextElement (JNIEnv *jenv, jclass self, jlong array){ pval *result; pval *handle = (pval*)(long)array; ALLOC_ZVAL(result); zend_hash_next_index_insert(Z_ARRVAL_P(handle), &result, sizeof(zval *), NULL); return (jlong)(long)result;}/* }}} *//* {{{ Java_net_php_reflect_hashIndexUpdate */JNIEXPORT jlong JNICALL Java_net_php_reflect_hashIndexUpdate (JNIEnv *jenv, jclass self, jlong array, jlong key){ pval *result; pval *handle = (pval*)(long)array; ALLOC_ZVAL(result); zend_hash_index_update(Z_ARRVAL_P(handle), (unsigned long)key, &result, sizeof(zval *), NULL); return (jlong)(long)result;}/* }}} *//* {{{ Java_net_php_reflect_hashUpdate */JNIEXPORT jlong JNICALL Java_net_php_reflect_hashUpdate (JNIEnv *jenv, jclass self, jlong array, jbyteArray key){ pval *result; pval pkey; pval *handle = (pval*)(long)array; ALLOC_ZVAL(result); Java_net_php_reflect_setResultFromString(jenv, self, (jlong)(long)&pkey, key); zend_hash_update(Z_ARRVAL_P(handle), Z_STRVAL(pkey), Z_STRLEN(pkey)+1, &result, sizeof(zval *), NULL); return (jlong)(long)result;}/* }}} *//* {{{ Java_net_php_reflect_setException */JNIEXPORT void JNICALL Java_net_php_reflect_setException (JNIEnv *jenv, jclass self, jlong result, jbyteArray value){ pval *presult = (pval*)(long)result; Java_net_php_reflect_setResultFromString(jenv, self, result, value); Z_TYPE_P(presult)=IS_EXCEPTION;}/* }}} *//* {{{ Java_net_php_reflect_setEnv */JNIEXPORT void JNICALL Java_net_php_reflect_setEnv (JNIEnv *newJenv, jclass self TSRMLS_DC){ jobject local_php_reflect; JG(jenv)=newJenv; if (!self) self = (*JG(jenv))->FindClass(JG(jenv), "net/php/reflect"); JG(reflect_class) = self; if (JG(php_reflect)) (*JG(jenv))->DeleteGlobalRef(JG(jenv), JG(php_reflect)); local_php_reflect = (*JG(jenv))->AllocObject(JG(jenv), JG(reflect_class)); JG(php_reflect) = (*JG(jenv))->NewGlobalRef(JG(jenv), local_php_reflect);}/* }}} *//* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: sw=4 ts=4 fdm=marker * vim<600: sw=4 ts=4 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -