*
*/
-
+#include <jni.h>
+#include <string.h>
// library header file's path
#include "orte.h"
// pregenerated header
#include "jorte/org_ocera_orte_DomainApp.h"
+#include "jorte/jorte_protos_api.h"
#include "jorte/4all.h"
+extern JavaVM *javavm;
+static jobject byte_buf;
+
+void deserialize(CDR_Codec *cdrCodec, void *instance) {
+ JNIEnv *env = 0;
+ jclass cls = 0;
+ jfieldID fid = 0;
+ jmethodID mid = 0;
+ jobject obj_bo = 0;
+
+ //set byte order only once
+ if(byte_buf) {
+ // get environment
+ (*javavm)->AttachCurrentThread(javavm, (void **)&env, NULL);
+ if(env == 0)
+ {
+ #ifdef TEST_STAGE
+ printf(":!c: env = NULL \n");
+ #endif
+ }
+
+ //prepare ByteOrder
+ cls = (*env)->FindClass(env, "java/nio/ByteOrder");
+ if (cls == 0) {
+ #ifdef TEST_STAGE
+ printf(":!c: cls = NULL \n");
+ #endif
+ }
+ if(cdrCodec->data_endian == BigEndian) {
+ fid = (*env)->GetStaticFieldID(env,
+ cls,
+ "BIG_ENDIAN",
+ "Ljava/nio/ByteOrder;");
+ }
+ else {
+ fid = (*env)->GetStaticFieldID(env,
+ cls,
+ "LITTLE_ENDIAN",
+ "Ljava/nio/ByteOrder;");
+ }
+ 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, byte_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,byte_buf,mid,obj_bo) == 0)
+ {
+ #ifdef TEST_STAGE
+ printf(":!c: set byte order failed.. \n");
+ #endif
+ }
+
+ // delete global reference
+ (*env)->DeleteGlobalRef(env, byte_buf);
+ byte_buf = 0;
+
+ (*javavm)->DetachCurrentThread(javavm);
+ }
+
+ //copy over the message instance
+ memcpy(instance,
+ cdrCodec->buffer,
+ cdrCodec->buf_len);
+}
+
JNIEXPORT jint JNICALL
Java_org_ocera_orte_DomainApp_jORTETypeRegisterAdd
-(JNIEnv *env, jclass cls, jlong handle, jstring jname, jlong jlength)
+(JNIEnv *env, jclass cls, jlong handle, jstring jname, jlong jlength, jobject obj_bb)
{
const char *name;
int b;
b = ORTETypeRegisterAdd((ORTEDomain *) handle,
name,
NULL,
- NULL,
+ (ORTETypeDeserialize)deserialize,
NULL,
(unsigned int) jlength);
// free memmory space
(*env)->ReleaseStringUTFChars(env,jname,name);
+
+ byte_buf = (*env)->NewGlobalRef(env, obj_bb);
+
#ifdef TEST_STAGE
printf(":c: jORTETypeRegisterAdd vraci %d [%d = ORTE_OK, %d = ORTE_BAD_HANDLE] \n",
b,ORTE_OK,ORTE_BAD_HANDLE);