X-Git-Url: https://rtime.felk.cvut.cz/gitweb/orte.git/blobdiff_plain/4d5ff5f99c785686d214d4a4b1a80a654dbfdc1d..123c8c321489e0d0528603d397ca552641dec89b:/orte/libjorte/JORTESubscriptionCreate.c diff --git a/orte/libjorte/JORTESubscriptionCreate.c b/orte/libjorte/JORTESubscriptionCreate.c index 0a9c877..e0838cf 100644 --- a/orte/libjorte/JORTESubscriptionCreate.c +++ b/orte/libjorte/JORTESubscriptionCreate.c @@ -28,6 +28,7 @@ #include #include +#include // library header file's path #include "orte_all.h" @@ -49,21 +50,15 @@ recvCallBack(const ORTERecvInfo *info, void *vinstance, void *recvCallBackParam) // jni varialbles JavaVM *jvm = 0; JNIEnv *env = 0; - jclass cls = 0; // local reference! - jclass cls_msg = 0; - jobject rinfo = 0; - jobject obj_msg; jobject obj_bo = 0; - jfieldID fid = 0; - jmethodID mid = 0; - jmethodID mid_callback = 0; - // - // if the subscriber has been destroyed, return + JORTECallbackContext_t *callback_cont; + + // HACK: if the subscriber has been destroyed, return if ((*(JORTECallbackContext_t **)recvCallBackParam) == 0) return; - JORTECallbackContext_t *callback_cont = *((JORTECallbackContext_t **)recvCallBackParam); + callback_cont = *((JORTECallbackContext_t **)recvCallBackParam); #ifdef TEST_STAGE printf("\n\n:c: --------------- recvCallBack called.. --------------- \n"); @@ -71,150 +66,44 @@ recvCallBack(const ORTERecvInfo *info, void *vinstance, void *recvCallBackParam) do { // set local variables from struct - if (callback_cont->jvm == 0) { - #ifdef TEST_STAGE - printf(":!c: jvm = NULL \n"); - #endif - break; - } jvm = callback_cont->jvm; // get env - (*jvm)->AttachCurrentThread(jvm, + if ((*jvm)->AttachCurrentThread(jvm, #ifdef __ANDROID__ - &env, + &env, #else - (void **)&env, + (void **)&env, #endif - NULL); - if (env == 0) { + NULL) != JNI_OK) { #ifdef TEST_STAGE - printf(":!c: env = NULL \n"); + printf(":!c: recvCallBack: AttachCurrentThread() failed \n"); #endif - break; + return; } - // + // set byte order only if it differs from that currently set if (info->data_endian != callback_cont->cur_endian) { - //prepare ByteOrder - cls = (*env)->FindClass(env, "java/nio/ByteOrder"); - if (cls == 0) { - #ifdef TEST_STAGE - printf(":!c: cls = NULL \n"); - #endif - } if (info->data_endian == BigEndian) { - fid = (*env)->GetStaticFieldID(env, - cls, - "BIG_ENDIAN", - "Ljava/nio/ByteOrder;"); + obj_bo = callback_cont->obj_BO_BE; callback_cont->cur_endian = BigEndian; } else { - fid = (*env)->GetStaticFieldID(env, - cls, - "LITTLE_ENDIAN", - "Ljava/nio/ByteOrder;"); + obj_bo = callback_cont->obj_BO_LE; callback_cont->cur_endian = LittleEndian; } - if (fid == 0) { - #ifdef TEST_STAGE - printf(":!c: fid = NULL \n"); - #endif - } - obj_bo = (*env)->GetStaticObjectField(env, cls, fid); - if (obj_bo == 0) { - #ifdef TEST_STAGE - printf(":!c: cls = NULL \n"); - #endif - } // set byte order to ByteBuffer - // get BB class - cls = (*env)->GetObjectClass(env, callback_cont->obj_buf); - if (cls == 0) { - #ifdef TEST_STAGE - printf(":!c: cls = NULL \n"); - #endif - } - // get methodID - order(ByteOrder) - mid = (*env)->GetMethodID(env, - cls, - "order", - "(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;"); - if (mid == 0) { - #ifdef TEST_STAGE - printf(":!c: mid = NULL \n"); - #endif - } - - // set ByteOrder - if ((*env)->CallObjectMethod(env, callback_cont->obj_buf, mid, obj_bo) == 0) { - #ifdef TEST_STAGE - printf(":!c: set byte order failed.. \n"); - #endif - } + (*env)->CallObjectMethod(env, callback_cont->obj_buf, callback_cont->mid_order, obj_bo); } - // - if (callback_cont->obj == 0) { - #ifdef TEST_STAGE - printf(":!c: obj = NULL \n"); - #endif - break; - } - // set local vars - rinfo = callback_cont->rinfo; - obj_msg = callback_cont->msg; - #ifdef TEST_STAGE printf(":c: #0 \n"); - printf(":c: env = %#" PRIxPTR ", obj_msg = %#" PRIxPTR " \n", (intptr_t)env, (intptr_t)obj_msg); + printf(":c: env = %#" PRIxPTR ", obj_msg = %#" PRIxPTR " \n", (intptr_t)env, (intptr_t)callback_cont->msg); #endif - - // - if (rinfo == 0) { - // find cls - cls = findClass(env, "org.ocera.orte.types.RecvInfo"); - if (cls == 0) { - #ifdef TEST_STAGE - printf(":!c: cls = NULL \n"); - #endif - break; - } - // call object constructor - mid = (*env)->GetMethodID(env, cls, "", "()V"); - if (mid == 0) { - #ifdef TEST_STAGE - printf(":!c: constructor failed! \n"); - #endif - break; - } - // create new object - rinfo = (*env)->NewObject(env, cls, mid); - if (rinfo == 0) { - #ifdef TEST_STAGE - printf(":!c: rinfo = NULL \n"); - #endif - break; - } - // create global reference - callback_cont->rinfo = (*env)->NewGlobalRef(env, rinfo); - if (callback_cont->rinfo == 0) { - #ifdef TEST_STAGE - printf(":!c: callback_cont->rinfo = NULL \n"); - #endif - break; - } - } //////////////////////////////////////////////////// - // set RecvInfo instance - if (setRecvInfo(env, info, callback_cont->rinfo) == 0) { - #ifdef TEST_STAGE - printf(":!c: setRecvInfo() failed! \n"); - #endif - break; - } + memcpy(callback_cont->info_buf, (void *)info, sizeof(ORTERecvInfo)); //////////////////////////////////////////////////// + // control print - only in TEST_STAGE #ifdef TEST_STAGE printf(":c: rinfo created :] \n"); @@ -233,79 +122,32 @@ recvCallBack(const ORTERecvInfo *info, void *vinstance, void *recvCallBackParam) #endif //////////////////////////////////////////////////// // update MessageData instance - // get cls - cls_msg = (*env)->GetObjectClass(env, obj_msg); - if (cls_msg == 0) { - #ifdef TEST_STAGE - printf(":!c: cls_msg = NULL \n"); - #endif - break; - } - ///////////////////////////////////////////////////// - // methodID - read() - mid = (*env)->GetMethodID(env, - cls_msg, - "read", - "()V"); - if (mid == 0) { - #ifdef TEST_STAGE - printf(":!c: mid = NULL \n"); - #endif - break; - } // call method (*env)->CallVoidMethod(env, - obj_msg, - mid); + callback_cont->msg, + callback_cont->mid_read); /* *************************** * * call JAVA CallBack method * * *************************** */ - #ifdef TEST_STAGE - printf(":c: call JAVA CallBack method \n"); - #endif - - - // get class - cls = (*env)->GetObjectClass(env, callback_cont->obj); - if (cls == 0) { - #ifdef TEST_STAGE - printf(":!c: cls = NULL \n"); - #endif - break; - } - // get method ID - mid = (*env)->GetMethodID(env, - cls, - "callback", - "(Lorg/ocera/orte/types/RecvInfo;Lorg/ocera/orte/types/MessageData;)V"); - if (mid == 0) { - #ifdef TEST_STAGE - printf(":!c: cls = NULL \n"); - #endif - break; - } - mid_callback = mid; - // #ifdef TEST_STAGE printf(":c: volam callback metodu.. halo jsi tam?? \n"); #endif // call object's method (*env)->CallVoidMethod(env, callback_cont->obj, /*obj*/ - mid_callback, + callback_cont->mid_callback, callback_cont->rinfo, - obj_msg); + callback_cont->msg); } while (0); // detach current thread - if ((*jvm)->DetachCurrentThread(jvm) != 0) + if ((*jvm)->DetachCurrentThread(jvm) != JNI_OK) printf(":c!: DetachCurrentThread failed! \n"); // #ifdef TEST_STAGE printf(":c: ------------ thats all from recvCallBack ------------ \n\n"); #endif - } /* ****************************************************************** * @@ -332,6 +174,8 @@ Java_org_ocera_orte_Subscription_jORTESubscriptionCreate JavaVM *jvm; jfieldID fid; jclass cls; + jmethodID mid; + jobject obj_info_buffer; // orte variables ORTESubscription *s = 0; ORTEDomain *d; @@ -349,6 +193,8 @@ Java_org_ocera_orte_Subscription_jORTESubscriptionCreate void *buffer; int flag_ok = 0; + /* HACK: allocate space for callback context structure and than for a pointer to it */ + // memory alocation // don't forget use free() funct.!! callback_cont = (JORTECallbackContext_t *)malloc(sizeof(JORTECallbackContext_t)); @@ -368,16 +214,15 @@ Java_org_ocera_orte_Subscription_jORTESubscriptionCreate } // get jvm jint b = (*env)->GetJavaVM(env, &jvm); - if (b < 0) { + if (b == JNI_OK) { #ifdef TEST_STAGE - printf(":!c: getJavaVM() failed! \n"); + printf(":c: getJavaVM succesfull.. \n"); #endif - break; - } - if (b == 0) { + } else { #ifdef TEST_STAGE - printf(":c: getJavaVM succesfull.. \n"); + printf(":!c: getJavaVM() failed! \n"); #endif + break; } callback_cont->jvm = jvm; callback_cont->cur_endian = (CDR_Endianness)jbyteOrder; @@ -390,6 +235,25 @@ Java_org_ocera_orte_Subscription_jORTESubscriptionCreate #endif break; } + // get ReceiveCallback class + cls = (*env)->GetObjectClass(env, callback_cont->obj); + if (cls == 0) { + #ifdef TEST_STAGE + printf(":!c: cls = NULL \n"); + #endif + break; + } + // get callback method ID + callback_cont->mid_callback = (*env)->GetMethodID(env, + cls, + "callback", + "(Lorg/ocera/orte/types/RecvInfo;Lorg/ocera/orte/types/MessageData;)V"); + if (callback_cont->mid_callback == 0) { + #ifdef TEST_STAGE + printf(":!c: mid_callback = NULL \n"); + #endif + break; + } // create global references callback_cont->obj_buf = (*env)->NewGlobalRef(env, jinstance); // @@ -408,8 +272,90 @@ Java_org_ocera_orte_Subscription_jORTESubscriptionCreate #endif break; } + // get MessageData class + cls = (*env)->GetObjectClass(env, callback_cont->msg); + if (cls == 0) { + #ifdef TEST_STAGE + printf(":!c: cls_msg = NULL \n"); + #endif + break; + } + ///////////////////////////////////////////////////// + // methodID - read() + callback_cont->mid_read = (*env)->GetMethodID(env, + cls, + "read", + "()V"); + if (callback_cont->mid_read == 0) { + #ifdef TEST_STAGE + printf(":!c: mid_read = NULL \n"); + #endif + break; + } // init RecvInfo pointer - callback_cont->rinfo = 0; + // find cls + cls = findClass(env, "org.ocera.orte.types.RecvInfo"); + if (cls == 0) { + #ifdef TEST_STAGE + printf(":!c: cls = NULL \n"); + #endif + break; + } + // call object constructor + mid = (*env)->GetMethodID(env, cls, "", "()V"); + if (mid == 0) { + #ifdef TEST_STAGE + printf(":!c: constructor failed! \n"); + #endif + break; + } + // create new object + callback_cont->rinfo = (*env)->NewObject(env, cls, mid); + if (callback_cont->rinfo == 0) { + #ifdef TEST_STAGE + printf(":!c: rinfo = NULL \n"); + #endif + break; + } + // create global reference + callback_cont->rinfo = (*env)->NewGlobalRef(env, callback_cont->rinfo); + if (callback_cont->rinfo == 0) { + #ifdef TEST_STAGE + printf(":!c: callback_cont->rinfo = NULL \n"); + #endif + break; + } + // lookup getBuffer() ID + mid = (*env)->GetMethodID(env, cls, "getBuffer", "()Ljava/nio/ByteBuffer;"); + if (mid == 0) { + #ifdef TEST_STAGE + printf(":!c: getBuffer() failed! \n"); + #endif + break; + } + // get ByteBuffer reference + obj_info_buffer = (*env)->CallObjectMethod(env, callback_cont->rinfo, mid); + callback_cont->info_buf = (*env)->GetDirectBufferAddress(env, obj_info_buffer); + // create global references for ByteOrders + cls = (*env)->FindClass(env, "java/nio/ByteOrder"); + fid = (*env)->GetStaticFieldID(env, + cls, + "BIG_ENDIAN", + "Ljava/nio/ByteOrder;"); + callback_cont->obj_BO_BE = (*env)->GetStaticObjectField(env, cls, fid); + callback_cont->obj_BO_BE = (*env)->NewGlobalRef(env, callback_cont->obj_BO_BE); + fid = (*env)->GetStaticFieldID(env, + cls, + "LITTLE_ENDIAN", + "Ljava/nio/ByteOrder;"); + callback_cont->obj_BO_LE = (*env)->GetStaticObjectField(env, cls, fid); + callback_cont->obj_BO_LE = (*env)->NewGlobalRef(env, callback_cont->obj_BO_LE); + // get methodID - order(ByteOrder) + cls = (*env)->GetObjectClass(env, callback_cont->obj_buf); + callback_cont->mid_order = (*env)->GetMethodID(env, + cls, + "order", + "(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;"); // cls = (*env)->GetObjectClass(env, obj); if (cls == 0) {