#include <stdlib.h>
#include <inttypes.h>
+#include <string.h>
// library header file's path
#include "orte_all.h"
// 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;
- //
+ JORTECallbackContext_t *callback_cont;
+
// 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");
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,
#else
(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
- }
- }
- //
- if (callback_cont->obj == 0) {
- #ifdef TEST_STAGE
- printf(":!c: obj = NULL \n");
- #endif
- break;
+ (*env)->CallObjectMethod(env, callback_cont->obj_buf, callback_cont->mid_order, obj_bo);
}
- // 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, "<init>", "()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");
#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
-
}
/* ****************************************************************** *
JavaVM *jvm;
jfieldID fid;
jclass cls;
+ jmethodID mid;
+ jobject obj_info_buffer;
// orte variables
ORTESubscription *s = 0;
ORTEDomain *d;
}
// 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;
#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);
//
#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, "<init>", "()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) {