54 |
54 |
55 JNIEXPORT void JNICALL |
55 JNIEXPORT void JNICALL |
56 Java_sun_nio_ch_DatagramChannelImpl_initIDs(JNIEnv *env, jclass clazz) |
56 Java_sun_nio_ch_DatagramChannelImpl_initIDs(JNIEnv *env, jclass clazz) |
57 { |
57 { |
58 clazz = (*env)->FindClass(env, "java/net/InetSocketAddress"); |
58 clazz = (*env)->FindClass(env, "java/net/InetSocketAddress"); |
|
59 CHECK_NULL(clazz); |
59 isa_class = (*env)->NewGlobalRef(env, clazz); |
60 isa_class = (*env)->NewGlobalRef(env, clazz); |
|
61 if (isa_class == NULL) { |
|
62 JNU_ThrowOutOfMemoryError(env, NULL); |
|
63 return; |
|
64 } |
60 isa_ctorID = (*env)->GetMethodID(env, clazz, "<init>", |
65 isa_ctorID = (*env)->GetMethodID(env, clazz, "<init>", |
61 "(Ljava/net/InetAddress;I)V"); |
66 "(Ljava/net/InetAddress;I)V"); |
|
67 CHECK_NULL(isa_ctorID); |
62 |
68 |
63 clazz = (*env)->FindClass(env, "sun/nio/ch/DatagramChannelImpl"); |
69 clazz = (*env)->FindClass(env, "sun/nio/ch/DatagramChannelImpl"); |
|
70 CHECK_NULL(clazz); |
64 dci_senderID = (*env)->GetFieldID(env, clazz, "sender", |
71 dci_senderID = (*env)->GetFieldID(env, clazz, "sender", |
65 "Ljava/net/SocketAddress;"); |
72 "Ljava/net/SocketAddress;"); |
|
73 CHECK_NULL(dci_senderID); |
66 dci_senderAddrID = (*env)->GetFieldID(env, clazz, |
74 dci_senderAddrID = (*env)->GetFieldID(env, clazz, |
67 "cachedSenderInetAddress", |
75 "cachedSenderInetAddress", |
68 "Ljava/net/InetAddress;"); |
76 "Ljava/net/InetAddress;"); |
|
77 CHECK_NULL(dci_senderAddrID); |
69 dci_senderPortID = (*env)->GetFieldID(env, clazz, |
78 dci_senderPortID = (*env)->GetFieldID(env, clazz, |
70 "cachedSenderPort", "I"); |
79 "cachedSenderPort", "I"); |
|
80 CHECK_NULL(dci_senderPortID); |
71 } |
81 } |
72 |
82 |
73 JNIEXPORT void JNICALL |
83 JNIEXPORT void JNICALL |
74 Java_sun_nio_ch_DatagramChannelImpl_disconnect0(JNIEnv *env, jobject this, |
84 Java_sun_nio_ch_DatagramChannelImpl_disconnect0(JNIEnv *env, jobject this, |
75 jobject fdo, jboolean isIPv6) |
85 jobject fdo, jboolean isIPv6) |
190 } |
200 } |
191 } |
201 } |
192 if (senderAddr == NULL) { |
202 if (senderAddr == NULL) { |
193 jobject isa = NULL; |
203 jobject isa = NULL; |
194 int port; |
204 int port; |
195 jobject ia = NET_SockaddrToInetAddress(env, (struct sockaddr *)&sa, |
205 jobject ia = NET_SockaddrToInetAddress(env, (struct sockaddr *)&sa, &port); |
196 &port); |
|
197 |
|
198 if (ia != NULL) { |
206 if (ia != NULL) { |
199 isa = (*env)->NewObject(env, isa_class, isa_ctorID, ia, port); |
207 isa = (*env)->NewObject(env, isa_class, isa_ctorID, ia, port); |
200 } |
208 } |
201 |
209 CHECK_NULL_RETURN(isa, IOS_THROWN); |
202 if (isa == NULL) { |
|
203 JNU_ThrowOutOfMemoryError(env, "heap allocation failed"); |
|
204 return IOS_THROWN; |
|
205 } |
|
206 |
210 |
207 (*env)->SetObjectField(env, this, dci_senderAddrID, ia); |
211 (*env)->SetObjectField(env, this, dci_senderAddrID, ia); |
208 (*env)->SetIntField(env, this, dci_senderPortID, |
212 (*env)->SetIntField(env, this, dci_senderPortID, |
209 NET_GetPortFromSockaddr((struct sockaddr *)&sa)); |
213 NET_GetPortFromSockaddr((struct sockaddr *)&sa)); |
210 (*env)->SetObjectField(env, this, dci_senderID, isa); |
214 (*env)->SetObjectField(env, this, dci_senderID, isa); |