JNIHelpers.cpp

00001 
00039 #include "jni.h"
00040 #include "JNIHelpers.h"
00041 
00042 // ### JNI
00043 
00044 #define JNI_UPDATE 0 // jni object release with copy
00045 //
00046 
00047 // ### JDK references
00048 
00049 // JDK classes
00050 jclass jdk_clsBoolean; // java.lang.Boolean
00051 jclass jdk_clsInteger; // java.lang.Integer
00052 jclass jdk_clsLong; // java.lang.Long
00053 jclass jdk_clsInet4Address; // java.net.Inet4Address
00054 jclass jdk_clsInet6Address; // java.net.Inet6Address
00055 jclass jdk_clsInetSocketAddress; // java.net.InetSocketAddress
00056 jclass jdk_clsSocketException; // java.net.SocketException
00057 jclass jdk_clsSet; // java.util.Set
00058 jclass jdk_clsIterator; // java.util.Iterator
00059 
00060 // JDK fields
00061 // FIXME private field access
00062 jfieldID ia_AddressID; // java.net.InetAddress#address
00063 
00064 // JDK methods
00065 jmethodID jdk_clsBoolean_initID; // new Boolean(boolean x)
00066 jmethodID jdk_clsInteger_initID; // new Integer(int x)
00067 jmethodID jdk_clsLong_initID; // new Long(long x)
00068 jmethodID jdk_clsInet4Address_initID; // new InetAddress()
00069 jmethodID jdk_clsInetSocketAddress_initID; // new InetSocketAddress(InetAddress x)
00070 jmethodID jdk_clsInetSocketAddress_getAddressID; //
00071 jmethodID jdk_clsInetSocketAddress_getPortID; //
00072 jmethodID jdk_clsSet_iteratorID; // Iterator set.iterator()
00073 jmethodID jdk_clsSet_addID; // boolean set.add(Object)
00074 jmethodID jdk_clsSet_containsID; // boolean set.contains(Object)
00075 jmethodID jdk_clsIterator_hasNextID; // boolean iterator.hasNext()
00076 jmethodID jdk_clsIterator_nextID; // Object iterator.next()
00077 
00078 // UDT classes
00079 jclass udt_clsFactoryInterfaceUDT; //com.barchart.udt.FactoryInterfaceUDT
00080 
00081 // UDT methods
00082 jfieldID udt_clsCCC_fld_nativeHandleID;
00083 
00084 void X_InitClassReference(JNIEnv *env, jclass *classReference,
00085                 const char *className) {
00086         CHK_NUL_RET_RET(env, "env");
00087         CHK_NUL_RET_RET(className, "className");
00088         CHK_NUL_RET_RET(classReference, "classReference");
00089         jclass klaz = env->FindClass(className);
00090         CHK_NUL_RET_RET(klaz, "klaz");
00091         *classReference = static_cast<jclass>(env->NewGlobalRef((jobject) klaz));
00092         CHK_NUL_RET_RET(*classReference, "*classReference");
00093 }
00094 
00095 void X_FreeClassReference(JNIEnv *env, jclass* globalRef) {
00096         CHK_NUL_RET_RET(env, "env");
00097         CHK_NUL_RET_RET(globalRef, "globalRef");
00098         env->DeleteGlobalRef(*globalRef);
00099         *globalRef = NULL;
00100 }
00101 
00102 // use native bool parameter
00103 jobject X_NewBoolean(JNIEnv *env, bool value) {
00104         CHK_NUL_RET_NUL(env, "env");
00105         return env->NewObject(jdk_clsBoolean, jdk_clsBoolean_initID, BOOLEAN(value));
00106 }
00107 
00108 // use native 32 bit int parameter
00109 jobject X_NewInteger(JNIEnv *env, int value) {
00110         CHK_NUL_RET_NUL(env, "env");
00111         return env->NewObject(jdk_clsInteger, jdk_clsInteger_initID, (jint) value);
00112 }
00113 
00114 // use native 64 bit long parameter
00115 jobject X_NewLong(JNIEnv* env, int64_t value) {
00116         CHK_NUL_RET_NUL(env, "env");
00117         return env->NewObject(jdk_clsLong, jdk_clsLong_initID, (jlong) value);
00118 }
00119 
00120 // NOTE: ipv4 only
00121 int X_InitSockAddr(sockaddr* sockAddr) {
00122         CHK_NUL_RET_ERR(sockAddr, "sockAddr");
00123         sockaddr_in* sockAddrIn = (sockaddr_in*) sockAddr;
00124         sockAddrIn->sin_family = AF_INET;
00125         memset(&(sockAddrIn->sin_zero), '\0', 8);
00126         return JNI_OK;
00127 }
00128 
00129 // NOTE: ipv4 only
00130 int X_ConvertInetSocketAddressToSockaddr(JNIEnv* env,
00131                 jobject objInetSocketAddress, sockaddr* sockAddr) {
00132 
00133         CHK_NUL_RET_ERR(env, "env");
00134         CHK_NUL_RET_ERR(sockAddr, "sockAddr");
00135         CHK_NUL_RET_ERR(objInetSocketAddress, "objInetSocketAddress");
00136 
00137         jobject objInetAddress = env->CallObjectMethod(objInetSocketAddress,
00138                         jdk_clsInetSocketAddress_getAddressID);
00139         CHK_NUL_RET_ERR(objInetAddress, "objInetAddress");
00140 
00141         // FIXME private field access
00142         jint address = env->GetIntField(objInetAddress, ia_AddressID);
00143         jint port = env->CallIntMethod(objInetSocketAddress,
00144                         jdk_clsInetSocketAddress_getPortID);
00145 
00146         sockaddr_in* sockAddrIn = (sockaddr_in*) sockAddr;
00147 
00148         sockAddrIn->sin_addr.s_addr = htonl(address);
00149         sockAddrIn->sin_port = htons(port); // msvc C4244
00150 
00151         return JNI_OK;
00152 
00153 }
00154 
00155 // NOTE: only ipv4
00156 jobject X_NewInetAddress(JNIEnv* env, jint address) {
00157 
00158         CHK_NUL_RET_NUL(env, "env");
00159         CHK_NUL_RET_NUL(jdk_clsInet4Address, "jdk_clsInet4Address");
00160 
00161         jobject objInetAddress = env->NewObject(jdk_clsInet4Address,
00162                         jdk_clsInet4Address_initID);
00163 
00164         CHK_NUL_RET_NUL(objInetAddress, "objInetAddress");
00165 
00166         // FIXME private field access
00167         env->SetIntField(objInetAddress, ia_AddressID, address);
00168 
00169         return objInetAddress;
00170 
00171 }
00172 
00173 // NOTE: ipv4 only
00174 jobject X_NewInetSocketAddress(JNIEnv* env, sockaddr* sockAddr) {
00175 
00176         CHK_NUL_RET_NUL(env, "env");
00177         CHK_NUL_RET_NUL(sockAddr, "sockAddr");
00178 
00179         sockaddr_in* sockAddrIn = (sockaddr_in*) sockAddr;
00180         jint address = ntohl(sockAddrIn->sin_addr.s_addr);
00181         jint port = ntohs(sockAddrIn->sin_port);
00182 
00183         jobject objInetAddress = X_NewInetAddress(env, address);
00184 
00185         CHK_NUL_RET_NUL(objInetAddress, "objInetAddress");
00186 
00187         jobject objInetSocketAddress = env->NewObject(jdk_clsInetSocketAddress,
00188                         jdk_clsInetSocketAddress_initID, objInetAddress, port);
00189 
00190         CHK_NUL_RET_NUL(objInetSocketAddress, "objInetSocketAddress");
00191 
00192         return objInetSocketAddress;
00193 
00194 }
00195 
00196 bool X_IsSockaddrEqualsInetSocketAddress(JNIEnv* env, sockaddr* sockAddr,
00197                 jobject socketAddress) {
00198 
00199         CHK_NUL_RET_FLS(env, "env");
00200         CHK_NUL_RET_FLS(sockAddr, "sockAddr");
00201         CHK_NUL_RET_FLS(socketAddress, "socketAddress");
00202 
00203         sockaddr_in* sockAddrIn = (sockaddr_in*) sockAddr;
00204 
00205         jint address1 = ntohl(sockAddrIn->sin_addr.s_addr);
00206         jint port1 = ntohs(sockAddrIn->sin_port);
00207 
00208         jobject objInetAddress = env->CallObjectMethod(socketAddress,
00209                         jdk_clsInetSocketAddress_getAddressID);
00210 
00211         CHK_NUL_RET_FLS(objInetAddress, "objInetAddress");
00212 
00213         // FIXME private field access
00214         jint address2 = env->GetIntField(objInetAddress, ia_AddressID);
00215         jint port2 = env->CallIntMethod(socketAddress,
00216                         jdk_clsInetSocketAddress_getAddressID);
00217 
00218         if (address1 == address2 && port1 == port2) {
00219                 return true;
00220         }
00221 
00222         return false;
00223 
00224 }

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