src/windows/native/java/net/NetworkInterface.c
Print this page
@@ -85,29 +85,19 @@
/* various JNI ids */
jclass ni_class; /* NetworkInterface */
-jmethodID ni_ctor; /* NetworkInterface() */
+jmethodID ni_ctrID; /* NetworkInterface() */
jfieldID ni_indexID; /* NetworkInterface.index */
jfieldID ni_addrsID; /* NetworkInterface.addrs */
jfieldID ni_bindsID; /* NetworkInterface.bindings */
jfieldID ni_nameID; /* NetworkInterface.name */
jfieldID ni_displayNameID; /* NetworkInterface.displayName */
jfieldID ni_childsID; /* NetworkInterface.childs */
-jclass ni_iacls; /* InetAddress */
-jfieldID ni_iaAddr; /* InetAddress.address */
-jclass ni_ia4cls; /* Inet4Address */
-jmethodID ni_ia4Ctor; /* Inet4Address() */
-
-jclass ni_ia6cls; /* Inet6Address */
-jmethodID ni_ia6ctrID; /* Inet6Address() */
-jfieldID ni_ia6ipaddressID;
-jfieldID ni_ia6ipaddressID;
-
jclass ni_ibcls; /* InterfaceAddress */
jmethodID ni_ibctrID; /* InterfaceAddress() */
jfieldID ni_ibaddressID; /* InterfaceAddress.address */
jfieldID ni_ibbroadcastID; /* InterfaceAddress.broadcast */
jfieldID ni_ibmaskID; /* InterfaceAddress.maskLength */
@@ -543,39 +533,29 @@
}
/*
* Get the various JNI ids that we require
*/
+ if (ni_ibmaskID == NULL) {
ni_class = (*env)->NewGlobalRef(env, cls);
ni_nameID = (*env)->GetFieldID(env, ni_class, "name", "Ljava/lang/String;");
ni_displayNameID = (*env)->GetFieldID(env, ni_class, "displayName", "Ljava/lang/String;");
ni_indexID = (*env)->GetFieldID(env, ni_class, "index", "I");
ni_addrsID = (*env)->GetFieldID(env, ni_class, "addrs", "[Ljava/net/InetAddress;");
ni_bindsID = (*env)->GetFieldID(env, ni_class, "bindings", "[Ljava/net/InterfaceAddress;");
ni_childsID = (*env)->GetFieldID(env, ni_class, "childs", "[Ljava/net/NetworkInterface;");
- ni_ctor = (*env)->GetMethodID(env, ni_class, "<init>", "()V");
+ ni_ctrID = (*env)->GetMethodID(env, ni_class, "<init>", "()V");
- ni_iacls = (*env)->FindClass(env, "java/net/InetAddress");
- ni_iacls = (*env)->NewGlobalRef(env, ni_iacls);
- ni_iaAddr = (*env)->GetFieldID(env, ni_iacls, "address", "I");
+ init(env);
- ni_ia4cls = (*env)->FindClass(env, "java/net/Inet4Address");
- ni_ia4cls = (*env)->NewGlobalRef(env, ni_ia4cls);
- ni_ia4Ctor = (*env)->GetMethodID(env, ni_ia4cls, "<init>", "()V");
-
- ni_ia6cls = (*env)->FindClass(env, "java/net/Inet6Address");
- ni_ia6cls = (*env)->NewGlobalRef(env, ni_ia6cls);
- ni_ia6ctrID = (*env)->GetMethodID(env, ni_ia6cls, "<init>", "()V");
- ni_ia6ipaddressID = (*env)->GetFieldID(env, ni_ia6cls, "ipaddress", "[B");
-
ni_ibcls = (*env)->FindClass(env, "java/net/InterfaceAddress");
ni_ibcls = (*env)->NewGlobalRef(env, ni_ibcls);
ni_ibctrID = (*env)->GetMethodID(env, ni_ibcls, "<init>", "()V");
ni_ibaddressID = (*env)->GetFieldID(env, ni_ibcls, "address", "Ljava/net/InetAddress;");
ni_ibbroadcastID = (*env)->GetFieldID(env, ni_ibcls, "broadcast", "Ljava/net/Inet4Address;");
ni_ibmaskID = (*env)->GetFieldID(env, ni_ibcls, "maskLength", "S");
-
+ }
}
/*
* Create a NetworkInterface object, populate the name and index, and
* populate the InetAddress array based on the IP addresses for this
@@ -591,11 +571,11 @@
jint bind_index;
/*
* Create a NetworkInterface object and populate it
*/
- netifObj = (*env)->NewObject(env, ni_class, ni_ctor);
+ netifObj = (*env)->NewObject(env, ni_class, ni_ctrID);
name = (*env)->NewStringUTF(env, ifs->name);
if (ifs->dNameIsUnicode) {
displayName = (*env)->NewString(env, (PWCHAR)ifs->displayName, wcslen ((PWCHAR)ifs->displayName));
} else {
displayName = (*env)->NewStringUTF(env, ifs->displayName);
@@ -616,11 +596,11 @@
if ((*env)->ExceptionOccurred(env)) {
free_netaddr(netaddrP);
return NULL;
}
}
- addrArr = (*env)->NewObjectArray(env, netaddrCount, ni_iacls, NULL);
+ addrArr = (*env)->NewObjectArray(env, netaddrCount, ia_class, NULL);
if (addrArr == NULL) {
free_netaddr(netaddrP);
return NULL;
}
@@ -634,39 +614,39 @@
bind_index = 0;
while (addrs != NULL) {
jobject iaObj, ia2Obj;
jobject ibObj = NULL;
if (addrs->addr.him.sa_family == AF_INET) {
- iaObj = (*env)->NewObject(env, ni_ia4cls, ni_ia4Ctor);
+ iaObj = (*env)->NewObject(env, ia4_class, ia4_ctrID);
if (iaObj == NULL) {
free_netaddr(netaddrP);
return NULL;
}
/* default ctor will set family to AF_INET */
- (*env)->SetIntField(env, iaObj, ni_iaAddr, ntohl(addrs->addr.him4.sin_addr.s_addr));
+ (*env)->SetIntField(env, iaObj, ia_addressID, ntohl(addrs->addr.him4.sin_addr.s_addr));
if (addrs->mask != -1) {
ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID);
if (ibObj == NULL) {
free_netaddr(netaddrP);
return NULL;
}
(*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj);
- ia2Obj = (*env)->NewObject(env, ni_ia4cls, ni_ia4Ctor);
+ ia2Obj = (*env)->NewObject(env, ia4_class, ia4_ctrID);
if (ia2Obj == NULL) {
free_netaddr(netaddrP);
return NULL;
}
- (*env)->SetIntField(env, ia2Obj, ni_iaAddr,
+ (*env)->SetIntField(env, ia2Obj, ia_addressID,
ntohl(addrs->brdcast.him4.sin_addr.s_addr));
(*env)->SetObjectField(env, ibObj, ni_ibbroadcastID, ia2Obj);
(*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask);
(*env)->SetObjectArrayElement(env, bindsArr, bind_index++, ibObj);
}
} else /* AF_INET6 */ {
int scope;
- iaObj = (*env)->NewObject(env, ni_ia6cls, ni_ia6ctrID);
+ iaObj = (*env)->NewObject(env, ia6_class, ia6_ctrID);
if (iaObj) {
jbyteArray ipaddress = (*env)->NewByteArray(env, 16);
if (ipaddress == NULL) {
return NULL;
}
@@ -676,11 +656,11 @@
if (scope != 0) { /* zero is default value, no need to set */
(*env)->SetIntField(env, iaObj, ia6_scopeidID, scope);
(*env)->SetBooleanField(env, iaObj, ia6_scopeidsetID, JNI_TRUE);
(*env)->SetObjectField(env, iaObj, ia6_scopeifnameID, netifObj);
}
- (*env)->SetObjectField(env, iaObj, ni_ia6ipaddressID, ipaddress);
+ (*env)->SetObjectField(env, iaObj, ia6_ipaddressID, ipaddress);
ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID);
if (ibObj == NULL) {
free_netaddr(netaddrP);
return NULL;
}
@@ -807,11 +787,11 @@
*/
JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByInetAddress0
(JNIEnv *env, jclass cls, jobject iaObj)
{
netif *ifList, *curr;
- jint addr = (*env)->GetIntField(env, iaObj, ni_iaAddr);
+ jint addr = (*env)->GetIntField(env, iaObj, ia_addressID);
jobject netifObj = NULL;
if (os_supports_ipv6 && ipv6_available()) {
return Java_java_net_NetworkInterface_getByInetAddress0_XP (env, cls, iaObj);
}