*
*/
+#include <stdlib.h>
#include <jni.h>
-#include <string.h>
// library header file's path
-#include "orte.h"
+#include "orte_all.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;
+#include "jorte/jorte_typedefs_defines.h"
+#include "jorte/4all.h"
-void deserialize(CDR_Codec *cdrCodec, void *instance) {
+void set_order(CDR_Codec *cdrCodec, void *param) {
JNIEnv *env = 0;
jclass cls = 0;
jfieldID fid = 0;
jmethodID mid = 0;
jobject obj_bo = 0;
+
+ JORTESetEndiannessContext_t *ctx = (JORTESetEndiannessContext_t*) param;
//set byte order only once
- if(byte_buf) {
+ if(cdrCodec->data_endian != ctx->cur_endian) {
// get environment
- (*javavm)->AttachCurrentThread(javavm, (void **)&env, NULL);
+ (*ctx->jvm)->AttachCurrentThread(ctx->jvm, (void **)&env, NULL);
if(env == 0)
{
#ifdef TEST_STAGE
cls,
"BIG_ENDIAN",
"Ljava/nio/ByteOrder;");
+ ctx->cur_endian = BigEndian;
}
else {
fid = (*env)->GetStaticFieldID(env,
cls,
"LITTLE_ENDIAN",
"Ljava/nio/ByteOrder;");
+ ctx->cur_endian = LittleEndian;
}
if(fid == 0) {
#ifdef TEST_STAGE
// set byte order to ByteBuffer
// get BB class
- cls = (*env)->GetObjectClass(env, byte_buf);
+ cls = (*env)->GetObjectClass(env, ctx->obj_buf);
if(cls == 0)
{
#ifdef TEST_STAGE
}
// set ByteOrder
- if((*env)->CallObjectMethod(env,byte_buf,mid,obj_bo) == 0)
+ if((*env)->CallObjectMethod(env,ctx->obj_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);
+ (*ctx->jvm)->DetachCurrentThread(ctx->jvm);
}
-
- //copy over the message instance
- memcpy(instance,
- cdrCodec->buffer,
- cdrCodec->buf_len);
}
JNIEXPORT jint JNICALL
const char *name;
int b;
+ JORTESetEndiannessContext_t *ctx = 0;
+
+ jobject byte_buf = 0;
+ JavaVM *jvm = 0;
+
+ // TODO free() !
+ ctx = (JORTESetEndiannessContext_t*) malloc(sizeof(JORTESetEndiannessContext_t));
+ if(ctx == 0) {
+ #ifdef TEST_STAGE
+ printf(":c!: ctx = NULL\n");
+ #endif
+ }
+ // create global reference for ByteBuffer
+ // TODO delete global reference
+ byte_buf = (*env)->NewGlobalRef(env, obj_bb);
+ ctx->obj_buf = byte_buf;
+ // get jvm
+ b = (*env)->GetJavaVM(env,&jvm);
+ if (b < 0)
+ {
+ printf(":!c: getJavaVM() failed! \n");
+ return 0;
+ }
+ ctx->jvm = jvm;
+ ctx->cur_endian = FLAG_ENDIANNESS;
+
// get type name from JAVA env
name = (*env)->GetStringUTFChars(env,jname,0);
// call ORTE function
b = ORTETypeRegisterAdd((ORTEDomain *) handle,
name,
NULL,
- (ORTETypeDeserialize)deserialize,
NULL,
- (unsigned int) jlength);
+ NULL,
+ (unsigned int) jlength,
+ (ORTETypeProcessEndianness) set_order,
+ (void*) ctx);
// 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);