]> rtime.felk.cvut.cz Git - orte.git/blobdiff - orte/libjorte/JORTESubscriptionCreate.c
Revert "JORTE: update license headers and clean-up includes"
[orte.git] / orte / libjorte / JORTESubscriptionCreate.c
index 998840d3ccfd908af1c28db0b1255bb112fa80be..b02edea7227c2c06254959bdf8dc73a2d13ce25f 100644 (file)
@@ -30,7 +30,7 @@
 #include <inttypes.h>
 
 // library header file's path
-#include "orte.h"
+#include "orte_all.h"
 // pregenerated header
 #include "jorte/org_ocera_orte_Subscription.h"
 // enable TEST_STAGE run level
@@ -51,9 +51,10 @@ recvCallBack(const ORTERecvInfo *info,void *vinstance, void *recvCallBackParam)
   JNIEnv          *env = 0;
   jclass           cls = 0; // local reference!
   jclass           cls_msg = 0;
-  jobject          obj = 0;
   jobject          rinfo = 0;
   jobject          obj_msg;
+  jobject          obj_bo = 0;
+  jfieldID         fid = 0;
   jmethodID        mid = 0;
   jmethodID        mid_callback = 0;
   //
@@ -75,7 +76,13 @@ recvCallBack(const ORTERecvInfo *info,void *vinstance, void *recvCallBackParam)
     }
     jvm = callback_cont->jvm;
     // get env
-    (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
+    (*jvm)->AttachCurrentThread(jvm,
+                                #ifdef __ANDROID__
+                                  &env,
+                                #else
+                                  (void **)&env,
+                                #endif
+                                NULL);
     if(env == 0)
     {
       #ifdef TEST_STAGE
@@ -84,6 +91,71 @@ recvCallBack(const ORTERecvInfo *info,void *vinstance, void *recvCallBackParam)
       break;
     }
     //
+    // 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;");
+        callback_cont->cur_endian = BigEndian;
+      }
+      else {
+        fid = (*env)->GetStaticFieldID(env,
+                                       cls,
+                                       "LITTLE_ENDIAN",
+                                       "Ljava/nio/ByteOrder;");
+        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
@@ -92,7 +164,6 @@ recvCallBack(const ORTERecvInfo *info,void *vinstance, void *recvCallBackParam)
       break;
     }
     // set local vars
-    obj = callback_cont->obj;
     rinfo = callback_cont->rinfo;
     obj_msg = callback_cont->msg;
 
@@ -263,6 +334,7 @@ Java_org_ocera_orte_Subscription_jORTESubscriptionCreate
  jstring   jtopic,    // subs topic
  jstring   jtname,    // subs typeName
  jobject   jinstance, // direct ByteBuffer
+ jint      jbyteOrder,// byte order of ByteBuffer
  jobject   obj_msg,   // messageData instance
  jobject   jdeadline,
  jobject   jminSeparation,
@@ -320,6 +392,7 @@ Java_org_ocera_orte_Subscription_jORTESubscriptionCreate
       #endif
     }
     callback_cont->jvm = jvm;
+    callback_cont->cur_endian = (CDR_Endianness) jbyteOrder;
     // create global references
     callback_cont->obj = (*env)->NewGlobalRef(env, obj_callback);
     //
@@ -331,6 +404,16 @@ Java_org_ocera_orte_Subscription_jORTESubscriptionCreate
       break;
     }
     // create global references
+    callback_cont->obj_buf = (*env)->NewGlobalRef(env, jinstance);
+    //
+    if (callback_cont->obj_buf == 0)
+    {
+      #ifdef TEST_STAGE
+        printf(":c: global reference not created! \n");
+      #endif
+      break;
+    }
+    // create global references
     callback_cont->msg = (*env)->NewGlobalRef(env, obj_msg);
     //
     if (callback_cont->msg == 0)