00001
00039 #include "jni.h"
00040 #include "JNIHelpers.h"
00041
00042
00043
00044 #define JNI_UPDATE 0 // jni object release with copy
00045
00046
00047
00048
00049
00050 jclass jdk_clsBoolean;
00051 jclass jdk_clsInteger;
00052 jclass jdk_clsLong;
00053 jclass jdk_clsInet4Address;
00054 jclass jdk_clsInet6Address;
00055 jclass jdk_clsInetSocketAddress;
00056 jclass jdk_clsSocketException;
00057 jclass jdk_clsSet;
00058 jclass jdk_clsIterator;
00059
00060
00061
00062 jfieldID ia_AddressID;
00063
00064
00065 jmethodID jdk_clsBoolean_initID;
00066 jmethodID jdk_clsInteger_initID;
00067 jmethodID jdk_clsLong_initID;
00068 jmethodID jdk_clsInet4Address_initID;
00069 jmethodID jdk_clsInetSocketAddress_initID;
00070 jmethodID jdk_clsInetSocketAddress_getAddressID;
00071 jmethodID jdk_clsInetSocketAddress_getPortID;
00072 jmethodID jdk_clsSet_iteratorID;
00073 jmethodID jdk_clsSet_addID;
00074 jmethodID jdk_clsSet_containsID;
00075 jmethodID jdk_clsIterator_hasNextID;
00076 jmethodID jdk_clsIterator_nextID;
00077
00078
00079 jclass udt_clsFactoryInterfaceUDT;
00080
00081
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
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
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
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
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
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
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);
00150
00151 return JNI_OK;
00152
00153 }
00154
00155
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
00167 env->SetIntField(objInetAddress, ia_AddressID, address);
00168
00169 return objInetAddress;
00170
00171 }
00172
00173
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
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 }