src/solaris/native/java/net/NetworkInterface.c

Print this page

        

@@ -92,20 +92,12 @@
 jfieldID ni_virutalID;
 jfieldID ni_childsID;
 jfieldID ni_parentID;
 jmethodID ni_ctrID;
 
-static jclass ni_iacls;
-static jclass ni_ia4cls;
-static jclass ni_ia6cls;
 static jclass ni_ibcls;
-static jmethodID ni_ia4ctrID;
-static jmethodID ni_ia6ctrID;
 static jmethodID ni_ibctrID;
-static jfieldID ni_iaaddressID;
-static jfieldID ni_iafamilyID;
-static jfieldID ni_ia6ipaddressID;
 static jfieldID ni_ibaddressID;
 static jfieldID ni_ib4broadcastID;
 static jfieldID ni_ib4maskID;
 
 static jobject createNetworkInterface(JNIEnv *env, netif *ifs);

@@ -128,10 +120,11 @@
  * Method:    init
  * Signature: ()V
  */
 JNIEXPORT void JNICALL
 Java_java_net_NetworkInterface_init(JNIEnv *env, jclass cls) {
+    if (ni_ib4maskID == NULL) {
     ni_class = (*env)->FindClass(env,"java/net/NetworkInterface");
     ni_class = (*env)->NewGlobalRef(env, ni_class);
     ni_nameID = (*env)->GetFieldID(env, ni_class,"name", "Ljava/lang/String;");
     ni_indexID = (*env)->GetFieldID(env, ni_class, "index", "I");
     ni_addrsID = (*env)->GetFieldID(env, ni_class, "addrs", "[Ljava/net/InetAddress;");

@@ -140,27 +133,19 @@
     ni_virutalID = (*env)->GetFieldID(env, ni_class, "virtual", "Z");
     ni_childsID = (*env)->GetFieldID(env, ni_class, "childs", "[Ljava/net/NetworkInterface;");
     ni_parentID = (*env)->GetFieldID(env, ni_class, "parent", "Ljava/net/NetworkInterface;");
     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_ia4cls = (*env)->FindClass(env, "java/net/Inet4Address");
-    ni_ia4cls = (*env)->NewGlobalRef(env, ni_ia4cls);
-    ni_ia6cls = (*env)->FindClass(env, "java/net/Inet6Address");
-    ni_ia6cls = (*env)->NewGlobalRef(env, ni_ia6cls);
     ni_ibcls = (*env)->FindClass(env, "java/net/InterfaceAddress");
     ni_ibcls = (*env)->NewGlobalRef(env, ni_ibcls);
-    ni_ia4ctrID = (*env)->GetMethodID(env, ni_ia4cls, "<init>", "()V");
-    ni_ia6ctrID = (*env)->GetMethodID(env, ni_ia6cls, "<init>", "()V");
     ni_ibctrID = (*env)->GetMethodID(env, ni_ibcls, "<init>", "()V");
-    ni_iaaddressID = (*env)->GetFieldID(env, ni_iacls, "address", "I");
-    ni_iafamilyID = (*env)->GetFieldID(env, ni_iacls, "family", "I");
-    ni_ia6ipaddressID = (*env)->GetFieldID(env, ni_ia6cls, "ipaddress", "[B");
     ni_ibaddressID = (*env)->GetFieldID(env, ni_ibcls, "address", "Ljava/net/InetAddress;");
     ni_ib4broadcastID = (*env)->GetFieldID(env, ni_ibcls, "broadcast", "Ljava/net/Inet4Address;");
     ni_ib4maskID = (*env)->GetFieldID(env, ni_ibcls, "maskLength", "S");
+    }
+
+    init(env);
 }
 
 
 /*
  * Class:     java_net_NetworkInterface

@@ -252,11 +237,11 @@
 JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByInetAddress0
     (JNIEnv *env, jclass cls, jobject iaObj) {
 
     netif *ifs, *curr;
 #ifdef AF_INET6
-    int family = (*env)->GetIntField(env, iaObj, ni_iafamilyID) == IPv4?
+    int family = (*env)->GetIntField(env, iaObj, ia_familyID) == IPv4?
         AF_INET : AF_INET6;
 #else
     int family = AF_INET;
 #endif
     jobject obj = NULL;

@@ -277,11 +262,11 @@
         while (addrP != NULL) {
 
             if (family == addrP->family) {
                 if (family == AF_INET) {
                     int address1 = htonl(((struct sockaddr_in*)addrP->addr)->sin_addr.s_addr);
-                    int address2 = (*env)->GetIntField(env, iaObj, ni_iaaddressID);
+                    int address2 = (*env)->GetIntField(env, iaObj, ia_addressID);
 
                     if (address1 == address2) {
                         match = JNI_TRUE;
                         break;
                     }

@@ -288,11 +273,11 @@
                 }
 
 #ifdef AF_INET6
                 if (family == AF_INET6) {
                     jbyte *bytes = (jbyte *)&(((struct sockaddr_in6*)addrP->addr)->sin6_addr);
-                    jbyteArray ipaddress = (*env)->GetObjectField(env, iaObj, ni_ia6ipaddressID);
+                    jbyteArray ipaddress = (*env)->GetObjectField(env, iaObj, ia6_ipaddressID);
                     jbyte caddr[16];
                     int i;
 
                     (*env)->GetByteArrayRegion(env, ipaddress, 0, 16, caddr);
                     i = 0;

@@ -432,11 +417,11 @@
     }
 
     /*
      * Create the array of InetAddresses
      */
-    addrArr = (*env)->NewObjectArray(env, addr_count,  ni_iacls, NULL);
+    addrArr = (*env)->NewObjectArray(env, addr_count,  ia_class, NULL);
     if (addrArr == NULL) {
         return NULL;
     }
 
     bindArr = (*env)->NewObjectArray(env, addr_count, ni_ibcls, NULL);

@@ -449,23 +434,23 @@
     while (addrP != NULL) {
         jobject iaObj = NULL;
         jobject ibObj = NULL;
 
         if (addrP->family == AF_INET) {
-            iaObj = (*env)->NewObject(env, ni_ia4cls, ni_ia4ctrID);
+            iaObj = (*env)->NewObject(env, ia4_class, ia4_ctrID);
             if (iaObj) {
-                 (*env)->SetIntField(env, iaObj, ni_iaaddressID,
+                 (*env)->SetIntField(env, iaObj, ia_addressID,
                      htonl(((struct sockaddr_in*)addrP->addr)->sin_addr.s_addr));
             }
             ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID);
             if (ibObj) {
               (*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj);
               if (addrP->brdcast) {
                 jobject ia2Obj = NULL;
-                ia2Obj = (*env)->NewObject(env, ni_ia4cls, ni_ia4ctrID);
+                ia2Obj = (*env)->NewObject(env, ia4_class, ia4_ctrID);
                 if (ia2Obj) {
-                  (*env)->SetIntField(env, ia2Obj, ni_iaaddressID,
+                  (*env)->SetIntField(env, ia2Obj, ia_addressID,
                                       htonl(((struct sockaddr_in*)addrP->brdcast)->sin_addr.s_addr));
                   (*env)->SetObjectField(env, ibObj, ni_ib4broadcastID, ia2Obj);
                   (*env)->SetShortField(env, ibObj, ni_ib4maskID, addrP->mask);
                 }
               }

@@ -474,11 +459,11 @@
         }
 
 #ifdef AF_INET6
         if (addrP->family == AF_INET6) {
             int scope=0;
-            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;
                 }

@@ -494,11 +479,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) {
               (*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj);
               (*env)->SetShortField(env, ibObj, ni_ib4maskID, addrP->mask);