X-Git-Url: https://rtime.felk.cvut.cz/gitweb/orte.git/blobdiff_plain/29d73728cf08d78d8ac634626d5840775c62befa..683e5f61f3e7b6c1ade1b4910264d8f96781ade0:/orte/libjorte/JORTETypeRegisterAdd.c diff --git a/orte/libjorte/JORTETypeRegisterAdd.c b/orte/libjorte/JORTETypeRegisterAdd.c index 73e9c64..f5e6718 100644 --- a/orte/libjorte/JORTETypeRegisterAdd.c +++ b/orte/libjorte/JORTETypeRegisterAdd.c @@ -25,16 +25,112 @@ * */ - +#include +#include // 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; @@ -45,11 +141,14 @@ Java_org_ocera_orte_DomainApp_jORTETypeRegisterAdd 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);