MADARA  3.4.1
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 
12  logger::Logger& logger, jobject obj)
13  : logger_(&logger)
14 {
16 
17  if (jvm.env)
18  {
20  "JavaBufferFilter::constructor:"
21  " allocating global reference for object\n");
22 
23  obj_ = (jobject)jvm.env->NewGlobalRef(obj);
24 
25  if (obj_)
26  {
28  "JavaBufferFilter::constructor:"
29  " allocating global reference for object's class\n");
30 
31  class_ = (jclass)jvm.env->NewGlobalRef(jvm.env->GetObjectClass(obj_));
32  if (class_)
33  {
35  "JavaBufferFilter::constructor:"
36  " class and object obtained successfully\n");
37  }
38  else
39  {
41  "JavaBufferFilter::constructor:"
42  " ERROR: class object inaccessible\n");
43  }
44  }
45  else
46  {
48  "JavaBufferFilter::constructor:"
49  " ERROR: object is invalid\n");
50  }
51  }
52  else
53  {
55  "JavaBufferFilter::constructor:"
56  " ERROR: unable to acquire JAVA environment\n");
57  }
58 }
59 
61 {
63  if (jvm.env)
64  {
66  "JavaBufferFilter::destructor:"
67  " Deleting global references\n");
68 
69  jvm.env->DeleteGlobalRef(obj_);
70  jvm.env->DeleteGlobalRef(class_);
71  }
72 }
73 
75  char* source, int size, int max_size) const
76 {
78  jint result(0);
79 
81  "JavaBufferFilter::encode:"
82  " Obtaining user-defined encode method\n");
83 
84  jmethodID call = jvm.env->GetMethodID(class_, "encode", "([BJJ)J");
85 
86  if (call)
87  {
89  "JavaBufferFilter::encode:"
90  " Creating a Java byte array and copying values\n");
91 
92  // obtain a Java buffer
93  jboolean isCopy;
94  jbyteArray new_array = jvm.env->NewByteArray(max_size);
95  void* data = jvm.env->GetPrimitiveArrayCritical((jarray)new_array, &isCopy);
96 
97  // populate the Java buffer with the contents our source buffer
98  memcpy(data, source, (size_t)size);
99 
101  "JavaBufferFilter::encode:"
102  " Calling user-defined encode method\n");
103  result = jvm.env->CallIntMethod(obj_, call, new_array, size, max_size);
104 
106  "JavaBufferFilter::encode:"
107  " Copying values from java byte array to the C buffer\n");
108 
109  // copy the Java memory to the caller buffer
110  memcpy(source, data, (size_t)result);
111 
113  "JavaBufferFilter::encode:"
114  " Deleting local Java variables\n");
115 
116  // clean up the Java code
117  jvm.env->ReleaseByteArrayElements(new_array, (jbyte*)data, JNI_ABORT);
118  jvm.env->DeleteLocalRef(new_array);
119  }
120  else
121  {
123  "JavaBufferFilter::encode:"
124  " ERROR: Unable to find user-defined encode method\n");
125  }
126 
127  return result;
128 }
129 
131  char* source, int size, int max_size) const
132 {
134  jint result(0);
135 
137  "JavaBufferFilter::decode:"
138  " Obtaining user-defined decode method\n");
139 
140  jmethodID call = jvm.env->GetMethodID(class_, "decode", "([BJJ)J");
141 
142  if (call)
143  {
145  "JavaBufferFilter::decode:"
146  " Creating a Java byte array and copying values\n");
147 
148  // obtain a Java buffer
149  jboolean isCopy;
150  jbyteArray new_array = jvm.env->NewByteArray(max_size);
151  void* data = jvm.env->GetPrimitiveArrayCritical((jarray)new_array, &isCopy);
152 
154  "JavaBufferFilter::decode:"
155  " Copying values from java byte array to the C buffer\n");
156 
157  // populate the Java buffer with the contents our source buffer
158  memcpy(data, source, (size_t)size);
159 
161  "JavaBufferFilter::decode:"
162  " Calling user-defined decode method\n");
163  result = jvm.env->CallIntMethod(obj_, call, new_array, size, max_size);
164 
165  // copy the Java memory to the caller buffer
166  memcpy(source, data, (size_t)result);
167 
169  "JavaBufferFilter::decode:"
170  " Deleting local Java variables\n");
171 
172  // clean up the Java code
173  jvm.env->ReleaseByteArrayElements(new_array, (jbyte*)data, JNI_ABORT);
174  jvm.env->DeleteLocalRef(new_array);
175  }
176  else
177  {
179  "JavaBufferFilter::decode:"
180  " ERROR: Unable to find user-defined decode method\n");
181  }
182 
183  return result;
184 }
185 
187 {
188  return "javanull";
189 }
190 
192 {
193  return madara::utility::get_uint_version("1.0.0");
194 }
195 
196 #endif // _MADARA_JAVA_
#define madara_logger_ptr_log(loggering, level,...)
Fast version of the madara::logger::log method for Logger pointers.
Definition: Logger.h:41
JavaBufferFilter(logger::Logger &logger, jobject obj)
Constructor.
jclass class_
the class of the Java object obj_
virtual ~JavaBufferFilter()
Destructor.
logger::Logger * logger_
a logger
virtual std::string get_id(void)
Gets the id of the filter.
virtual uint32_t get_version(void)
Gets the version of the filter.
virtual int encode(char *source, int size, int max_size) const
Encodes the buffer in place using AES encryption.
virtual int decode(char *source, int size, int max_size) const
Decodes the buffer in place using AES encryption.
A multi-threaded logger for logging to one or more destinations.
Definition: Logger.h:165
This class encapsulates attaching and detaching to a VM.
Definition: Acquire_VM.h:25
JNIEnv * env
The Java environment.
Definition: Acquire_VM.h:58
constexpr string_t string
Provides knowledge logging services to files and terminals.
Definition: GlobalLogger.h:12
uint32_t get_uint_version(const std::string &str_version)
Converts a string version to a uint32.
Definition: Utility.cpp:30