JNIHelpers.h

00001 
00039 #ifndef JNIHELPERS_H_
00040 #define JNIHELPERS_H_
00041 
00042 #include "udt.h"
00043 
00044 #include <cassert>
00045 #include <climits>
00046 #include <cstring>
00047 #include <vector>
00048 #include <algorithm>
00049 
00050 #include "jni.h"
00051 
00052 // ### JNI
00053 
00054 #define JNI_UPDATE 0 // jni object release with copy
00055 //
00056 
00057 extern "C"{
00058 
00059 // ### JDK references
00060 
00061 // JDK classes
00062 extern jclass jdk_clsBoolean; // java.lang.Boolean
00063 extern jclass jdk_clsInteger; // java.lang.Integer
00064 extern jclass jdk_clsLong; // java.lang.Long
00065 extern jclass jdk_clsInet4Address; // java.net.Inet4Address
00066 extern jclass jdk_clsInet6Address; // java.net.Inet6Address
00067 extern jclass jdk_clsInetSocketAddress; // java.net.InetSocketAddress
00068 extern jclass jdk_clsSocketException; // java.net.SocketException
00069 extern jclass jdk_clsSet; // java.util.Set
00070 extern jclass jdk_clsIterator; // java.util.Iterator
00071 
00072 // JDK fields
00073 // FIXME private field access
00074 extern jfieldID ia_AddressID; // java.net.InetAddress#address
00075 
00076 // JDK methods
00077 extern jmethodID jdk_clsBoolean_initID; // new Boolean(boolean x)
00078 extern jmethodID jdk_clsInteger_initID; // new Integer(int x)
00079 extern jmethodID jdk_clsLong_initID; // new Long(long x)
00080 extern jmethodID jdk_clsInet4Address_initID; // new InetAddress()
00081 extern jmethodID jdk_clsInetSocketAddress_initID; // new InetSocketAddress(InetAddress x)
00082 extern jmethodID jdk_clsInetSocketAddress_getAddressID; //
00083 extern jmethodID jdk_clsInetSocketAddress_getPortID; //
00084 extern jmethodID jdk_clsSet_iteratorID; // Iterator set.iterator()
00085 extern jmethodID jdk_clsSet_addID; // boolean set.add(Object)
00086 extern jmethodID jdk_clsSet_containsID; // boolean set.contains(Object)
00087 extern jmethodID jdk_clsIterator_hasNextID; // boolean iterator.hasNext()
00088 extern jmethodID jdk_clsIterator_nextID; // Object iterator.next()
00089 
00090 // UDT classes
00091 extern jclass udt_clsFactoryInterfaceUDT;
00092 
00093 // UDT methods
00094 extern jfieldID udt_clsCCC_fld_nativeHandleID;
00095 
00096 //#define EOL "\n"
00097 
00098 // special UDT method return value
00099 #define UDT_TIMEOUT 0
00100 
00101 // TODO make more portable mingw / msvc
00102 #ifdef _MSC_VER
00103 #define __func__ __FUNCTION__
00104 #endif
00105 
00106 //
00107 // null pointer safety
00108 //
00109 #define CHK_LOG(title,comment) printf ("%s function: %s comment: %s", title, __func__, comment);
00110 //
00111 #define CHK_NUL_RET_RET(reference,comment) if ((reference) == NULL) \
00112         { CHK_LOG("CHK_NUL_RET_RET;",comment); return; }
00113 //
00114 #define CHK_NUL_RET_NUL(reference,comment) if ((reference) == NULL) \
00115         { CHK_LOG("CHK_NUL_RET_NUL;",comment); return NULL; }
00116 //
00117 #define CHK_NUL_RET_FLS(reference,comment) if ((reference) == NULL) \
00118         { CHK_LOG("CHK_NUL_RET_FLS;",comment); return false; }
00119 //
00120 #define CHK_NUL_RET_ERR(reference,comment) if ((reference) == NULL) \
00121         { CHK_LOG("CHK_NUL_RET_ERR;",comment); return JNI_ERR; }
00122 //
00123 // c++ <-> java, bool <-> boolean conversions
00124 #define BOOL(x) (((x) == JNI_TRUE) ? true : false) // from java to c++
00125 #define BOOLEAN(x) ((jboolean) ( ((x) == true) ? JNI_TRUE : JNI_FALSE )) // from c++ to java
00126 //
00127 // free/malloc convenience
00128 #define FREE(x) if ((x) != NULL) { free(x); x = NULL; }
00129 #define MALLOC(var,type,size) type* var = (type*) malloc(sizeof(type) * size);
00130 
00131 // declare unused explicitly or else see compiler warnings
00132 #define UNUSED(x) ((void)(x))
00133 
00134 void X_InitClassReference(JNIEnv *env, jclass *classReference,
00135                 const char *className);
00136 
00137 void X_FreeClassReference(JNIEnv *env, jclass* globalRef);
00138 
00139 jobject X_NewBoolean(JNIEnv *env, bool value);
00140 
00141 jobject X_NewInteger(JNIEnv *env, int value);
00142 
00143 jobject X_NewLong(JNIEnv* env, int64_t value);
00144 
00145 int X_InitSockAddr(sockaddr* sockAddr);
00146 
00147 inline bool X_IsInRange(jlong min, jlong var, jlong max) {
00148         if (min <= var && var <= max) {
00149                 return true;
00150         } else {
00151                 return false;
00152         }
00153 }
00154 
00155 inline void X_ConvertMillisIntoTimeValue(const jlong millisTimeout,
00156                 timeval* timeValue) {
00157         if (millisTimeout < 0) { // infinite wait
00158                 timeValue->tv_sec = INT_MAX;
00159                 timeValue->tv_usec = 0;
00160         } else if (millisTimeout > 0) { // finite wait
00161                 timeValue->tv_sec = millisTimeout / 1000; // msvc C4244
00162                 timeValue->tv_usec = (millisTimeout % 1000) * 1000;
00163         } else { // immediate return (not less the UDT event slice of 10 ms)
00164                 timeValue->tv_sec = 0;
00165                 timeValue->tv_usec = 0;
00166         }
00167 }
00168 
00169 // NOTE: ipv4 only
00170 int X_ConvertInetSocketAddressToSockaddr(JNIEnv* env,
00171                 jobject objInetSocketAddress, sockaddr* sockAddr);
00172 
00173 // NOTE: only ipv4
00174 jobject X_NewInetAddress(JNIEnv* env, jint address);
00175 
00176 // NOTE: ipv4 only
00177 jobject X_NewInetSocketAddress(JNIEnv* env, sockaddr* sockAddr);
00178 
00179 // NOTE: ipv4 only
00180 bool X_IsSockaddrEqualsInetSocketAddress(JNIEnv* env, sockaddr* sockAddr,
00181                 jobject socketAddress);
00182 
00183 
00184 void UDT_ThrowExceptionUDT_Message(JNIEnv* env, const jint socketID,
00185                 const char *comment);
00186 
00187 }//extern "C"
00188 
00189 
00190 
00191 
00192 #endif /* JNIHELPERS_H_ */

Generated on 9 Feb 2013 for barchart-udt-core-2.2.2 by  doxygen 1.6.1