MADARA  3.1.8
JavaBufferFilter.cpp
Go to the documentation of this file.
1 
2 #ifdef _MADARA_JAVA_
3 
4 #include <string.h>
5 
6 #include "JavaBufferFilter.h"
7 
10 
11 
12 madara::filters::JavaBufferFilter::JavaBufferFilter (
13  logger::Logger & logger, jobject obj)
14  : logger_ (&logger)
15 {
17 
18  if (jvm.env)
19  {
21  "JavaBufferFilter::constructor:" \
22  " allocating global reference for object\n");
23 
24  obj_ = (jobject)jvm.env->NewGlobalRef (obj);
25 
26  if (obj_)
27  {
29  "JavaBufferFilter::constructor:" \
30  " allocating global reference for object's class\n");
31 
32  class_ = (jclass)jvm.env->NewGlobalRef (jvm.env->GetObjectClass (obj_));
33  if (class_)
34  {
36  "JavaBufferFilter::constructor:" \
37  " class and object obtained successfully\n");
38  }
39  else
40  {
42  "JavaBufferFilter::constructor:" \
43  " ERROR: class object inaccessible\n");
44  }
45  }
46  else
47  {
49  "JavaBufferFilter::constructor:" \
50  " ERROR: object is invalid\n");
51  }
52  }
53  else
54  {
56  "JavaBufferFilter::constructor:" \
57  " ERROR: unable to acquire JAVA environment\n");
58  }
59 }
60 
61 
62 madara::filters::JavaBufferFilter::~JavaBufferFilter ()
63 {
65  if (jvm.env)
66  {
68  "JavaBufferFilter::destructor:" \
69  " Deleting global references\n");
70 
71  jvm.env->DeleteGlobalRef (obj_);
72  jvm.env->DeleteGlobalRef (class_);
73  }
74 }
75 
76 int
77 madara::filters::JavaBufferFilter::encode (
78  unsigned char * source, int size, int max_size) const
79 {
81  jint result (0);
82 
84  "JavaBufferFilter::encode:" \
85  " Obtaining user-defined encode method\n");
86 
87  jmethodID call = jvm.env->GetMethodID (class_, "encode", "([BJJ)J");
88 
89  if (call)
90  {
92  "JavaBufferFilter::encode:" \
93  " Creating a Java byte array and copying values\n");
94 
95  // obtain a Java buffer
96  jboolean isCopy;
97  jbyteArray new_array = jvm.env->NewByteArray (max_size);
98  void * data = jvm.env->GetPrimitiveArrayCritical ((jarray)new_array, &isCopy);
99 
100  // populate the Java buffer with the contents our source buffer
101  memcpy (data, source, (size_t)size);
102 
104  "JavaBufferFilter::encode:" \
105  " Calling user-defined encode method\n");
106  result = jvm.env->CallIntMethod (obj_, call, new_array, size, max_size);
107 
109  "JavaBufferFilter::encode:" \
110  " Copying values from java byte array to the C buffer\n");
111 
112  // copy the Java memory to the caller buffer
113  memcpy (source, data, (size_t)result);
114 
116  "JavaBufferFilter::encode:" \
117  " Deleting local Java variables\n");
118 
119  // clean up the Java code
120  jvm.env->ReleaseByteArrayElements (new_array, (jbyte *)data, JNI_ABORT);
121  jvm.env->DeleteLocalRef (new_array);
122  }
123  else
124  {
126  "JavaBufferFilter::encode:" \
127  " ERROR: Unable to find user-defined encode method\n");
128  }
129 
130  return result;
131 }
132 
133 int
134 madara::filters::JavaBufferFilter::decode (
135  unsigned char * source, int size, int max_size) const
136 {
138  jint result (0);
139 
141  "JavaBufferFilter::decode:" \
142  " Obtaining user-defined decode method\n");
143 
144  jmethodID call = jvm.env->GetMethodID (class_, "decode", "([BJJ)J");
145 
146  if (call)
147  {
149  "JavaBufferFilter::decode:" \
150  " Creating a Java byte array and copying values\n");
151 
152  // obtain a Java buffer
153  jboolean isCopy;
154  jbyteArray new_array = jvm.env->NewByteArray (max_size);
155  void * data = jvm.env->GetPrimitiveArrayCritical ((jarray)new_array, &isCopy);
156 
158  "JavaBufferFilter::decode:" \
159  " Copying values from java byte array to the C buffer\n");
160 
161  // populate the Java buffer with the contents our source buffer
162  memcpy (data, source, (size_t)size);
163 
165  "JavaBufferFilter::decode:" \
166  " Calling user-defined decode method\n");
167  result = jvm.env->CallIntMethod (obj_, call, new_array, size, max_size);
168 
169  // copy the Java memory to the caller buffer
170  memcpy (source, data, (size_t)result);
171 
173  "JavaBufferFilter::decode:" \
174  " Deleting local Java variables\n");
175 
176  // clean up the Java code
177  jvm.env->ReleaseByteArrayElements (new_array, (jbyte *)data, JNI_ABORT);
178  jvm.env->DeleteLocalRef (new_array);
179  }
180  else
181  {
183  "JavaBufferFilter::decode:" \
184  " ERROR: Unable to find user-defined decode method\n");
185  }
186 
187  return result;
188 }
189 
190 #endif // _MADARA_JAVA_
JNIEnv * env
The Java environment.
Definition: Acquire_VM.h:58
This class encapsulates attaching and detaching to a VM.
Definition: Acquire_VM.h:24
Provides knowledge logging services to files and terminals.
Definition: GlobalLogger.h:11
A multi-threaded logger for logging to one or more destinations.
Definition: Logger.h:88
#define madara_logger_ptr_log(logger, level,...)
Fast version of the madara::logger::log method for Logger pointers.
Definition: Logger.h:32