Merge "JarFile: Optimize getMetaInfEntryNames."
diff --git a/ojluni/src/main/java/java/net/Inet4Address.java b/ojluni/src/main/java/java/net/Inet4Address.java
index 57da1c4..1570fad 100755
--- a/ojluni/src/main/java/java/net/Inet4Address.java
+++ b/ojluni/src/main/java/java/net/Inet4Address.java
@@ -106,13 +106,6 @@
     public static final InetAddress LOOPBACK =
             new Inet4Address("localhost", new byte[] { 127, 0, 0, 1 });
 
-    /*
-     * Perform initializations.
-     */
-    static {
-        init();
-    }
-
     Inet4Address() {
         super();
         holder().hostName = null;
@@ -386,9 +379,4 @@
     {
         return (src[0] & 0xff) + "." + (src[1] & 0xff) + "." + (src[2] & 0xff) + "." + (src[3] & 0xff);
     }
-
-    /**
-     * Perform class load-time initializations.
-     */
-    private static native void init();
 }
diff --git a/ojluni/src/main/java/java/net/Inet6Address.java b/ojluni/src/main/java/java/net/Inet6Address.java
index f66b68d..4b353e5 100755
--- a/ojluni/src/main/java/java/net/Inet6Address.java
+++ b/ojluni/src/main/java/java/net/Inet6Address.java
@@ -210,13 +210,6 @@
 
     private static final long serialVersionUID = 6880410070516793377L;
 
-    /*
-     * Perform initializations.
-     */
-    static {
-        init();
-    }
-
     Inet6Address() {
         super();
         holder().hostName = null;
@@ -768,11 +761,6 @@
     }
 
     /**
-     * Perform class load-time initializations.
-     */
-    private static native void init();
-
-    /**
      * Following field is only used during (de)/serialization
      */
     private String ifname;
diff --git a/ojluni/src/main/java/java/net/InetAddress.java b/ojluni/src/main/java/java/net/InetAddress.java
index d8057ff..3ea1086 100755
--- a/ojluni/src/main/java/java/net/InetAddress.java
+++ b/ojluni/src/main/java/java/net/InetAddress.java
@@ -246,13 +246,6 @@
     /** use serialVersionUID from JDK 1.0.2 for interoperability */
     private static final long serialVersionUID = 3286316764910316507L;
 
-    /*
-     * Load net library into runtime, and perform initializations.
-     */
-    static {
-        init();
-    }
-
     /**
      * Constructor for the Socket.accept() method.
      * This creates an empty InetAddress, which is filled in by
@@ -823,12 +816,6 @@
         return impl.lookupAllHostAddr(local, NETID_UNSET)[0];
     }
 
-    /**
-     * Perform class load-time initializations.
-     */
-    private static native void init();
-
-
     /*
      * Returns the InetAddress representing anyLocalAddress
      * (typically 0.0.0.0 or ::0)
diff --git a/ojluni/src/main/java/java/net/NetworkInterface.java b/ojluni/src/main/java/java/net/NetworkInterface.java
index 1f5825f..edae4b3 100755
--- a/ojluni/src/main/java/java/net/NetworkInterface.java
+++ b/ojluni/src/main/java/java/net/NetworkInterface.java
@@ -54,7 +54,6 @@
     private static final int defaultIndex; /* index of defaultInterface */
 
     static {
-        init();
         defaultInterface = DefaultInterface.getDefault();
         if (defaultInterface != null) {
             defaultIndex = defaultInterface.getIndex();
@@ -541,8 +540,6 @@
         return result;
     }
 
-    private static native void init();
-
     /**
      * Returns the default network interface of this system
      *
diff --git a/ojluni/src/main/java/java/net/PlainSocketImpl.java b/ojluni/src/main/java/java/net/PlainSocketImpl.java
index 32be8e5..b6a2677 100755
--- a/ojluni/src/main/java/java/net/PlainSocketImpl.java
+++ b/ojluni/src/main/java/java/net/PlainSocketImpl.java
@@ -36,10 +36,6 @@
 
 class PlainSocketImpl extends AbstractPlainSocketImpl
 {
-    static {
-        initProto();
-    }
-
     /**
      * Constructs an empty instance.
      */
@@ -72,8 +68,6 @@
 
     native void socketShutdown(int howto) throws IOException;
 
-    static native void initProto();
-
     native void socketSetOption(int cmd, boolean on, Object value)
         throws SocketException;
 
diff --git a/ojluni/src/main/native/Inet4Address.c b/ojluni/src/main/native/Inet4Address.c
index cd41068..5c7df40 100755
--- a/ojluni/src/main/native/Inet4Address.c
+++ b/ojluni/src/main/native/Inet4Address.c
@@ -37,13 +37,7 @@
 jclass ia4_class;
 jmethodID ia4_ctrID;
 
-/*
- * Class:     java_net_Inet4Address
- * Method:    init
- * Signature: ()V
- */
-JNIEXPORT void JNICALL
-Inet4Address_init(JNIEnv *env, jclass cls) {
+static void Inet4Address_init(JNIEnv *env) {
     jclass c = (*env)->FindClass(env, "java/net/Inet4Address");
     CHECK_NULL(c);
     ia4_class = (*env)->NewGlobalRef(env, c);
@@ -52,10 +46,6 @@
     CHECK_NULL(ia4_ctrID);
 }
 
-static JNINativeMethod gMethods[] = {
-  NATIVE_METHOD(Inet4Address, init, "()V"),
-};
-
 void register_java_net_Inet4Address(JNIEnv* env) {
-  jniRegisterNativeMethods(env, "java/net/Inet4Address", gMethods, NELEM(gMethods));
+    Inet4Address_init(env);
 }
diff --git a/ojluni/src/main/native/Inet6Address.c b/ojluni/src/main/native/Inet6Address.c
index 2dfc38f..ad2d978 100755
--- a/ojluni/src/main/native/Inet6Address.c
+++ b/ojluni/src/main/native/Inet6Address.c
@@ -43,13 +43,7 @@
 jfieldID ia6_scopeifnamesetID;
 jmethodID ia6_ctrID;
 
-/*
- * Class:     java_net_Inet6Address
- * Method:    init
- * Signature: ()V
- */
-JNIEXPORT void JNICALL
-Inet6Address_init(JNIEnv *env, jclass cls) {
+static void Inet6Address_init(JNIEnv *env) {
     jclass c = (*env)->FindClass(env, "java/net/Inet6Address");
     CHECK_NULL(c);
     ia6_class = (*env)->NewGlobalRef(env, c);
@@ -68,10 +62,6 @@
     CHECK_NULL(ia6_ctrID);
 }
 
-static JNINativeMethod gMethods[] = {
-  NATIVE_METHOD(Inet6Address, init, "()V"),
-};
-
 void register_java_net_Inet6Address(JNIEnv* env) {
-  jniRegisterNativeMethods(env, "java/net/Inet6Address", gMethods, NELEM(gMethods));
+    Inet6Address_init(env);
 }
diff --git a/ojluni/src/main/native/InetAddress.c b/ojluni/src/main/native/InetAddress.c
index ef76ed8..0f0fefe 100755
--- a/ojluni/src/main/native/InetAddress.c
+++ b/ojluni/src/main/native/InetAddress.c
@@ -42,13 +42,7 @@
 jfieldID iac_familyID;
 jfieldID iac_hostNameID;
 
-/*
- * Class:     java_net_InetAddress
- * Method:    init
- * Signature: ()V
- */
-JNIEXPORT void JNICALL
-InetAddress_init(JNIEnv *env, jclass cls) {
+static void InetAddress_init(JNIEnv *env) {
     jclass c = (*env)->FindClass(env,"java/net/InetAddress");
     CHECK_NULL(c);
     ia_class = (*env)->NewGlobalRef(env, c);
@@ -67,10 +61,6 @@
     CHECK_NULL(iac_hostNameID);
 }
 
-static JNINativeMethod gMethods[] = {
-  NATIVE_METHOD(InetAddress, init, "()V"),
-};
-
 void register_java_net_InetAddress(JNIEnv* env) {
-  jniRegisterNativeMethods(env, "java/net/InetAddress", gMethods, NELEM(gMethods));
+  InetAddress_init(env);
 }
diff --git a/ojluni/src/main/native/NetworkInterface.c b/ojluni/src/main/native/NetworkInterface.c
index a147dd0..d9dcff2 100755
--- a/ojluni/src/main/native/NetworkInterface.c
+++ b/ojluni/src/main/native/NetworkInterface.c
@@ -125,13 +125,7 @@
 
 /******************* Java entry points *****************************/
 
-/*
- * Class:     java_net_NetworkInterface
- * Method:    init
- * Signature: ()V
- */
-JNIEXPORT void JNICALL
-NetworkInterface_init(JNIEnv *env, jclass cls) {
+static void NetworkInterface_init(JNIEnv *env) {
     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;");
@@ -1080,10 +1074,8 @@
   NATIVE_METHOD(NetworkInterface, getByInetAddress0, "(Ljava/net/InetAddress;)Ljava/net/NetworkInterface;"),
   NATIVE_METHOD(NetworkInterface, getByIndex0, "(I)Ljava/net/NetworkInterface;"),
   NATIVE_METHOD(NetworkInterface, getByName0, "(Ljava/lang/String;)Ljava/net/NetworkInterface;"),
-  NATIVE_METHOD(NetworkInterface, init, "()V"),
-
 };
 
 void register_java_net_NetworkInterface(JNIEnv* env) {
-  jniRegisterNativeMethods(env, "java/net/NetworkInterface", gMethods, NELEM(gMethods));
+    NetworkInterface_init(env);
 }
diff --git a/ojluni/src/main/native/PlainDatagramSocketImpl.c b/ojluni/src/main/native/PlainDatagramSocketImpl.c
index 1b1e3f6..c7b753e 100755
--- a/ojluni/src/main/native/PlainDatagramSocketImpl.c
+++ b/ojluni/src/main/native/PlainDatagramSocketImpl.c
@@ -168,11 +168,6 @@
     IO_fd_fdID = NET_GetFileDescriptorID(env);
     CHECK_NULL(IO_fd_fdID);
 
-    InetAddress_init(env, 0);
-    Inet4Address_init(env, 0);
-    Inet6Address_init(env, 0);
-    NetworkInterface_init(env, 0);
-
 #ifdef __linux__
 #ifdef AF_INET6
     pdsi_multicastInterfaceID = (*env)->GetFieldID(env, cls, "multicastInterface", "I");
diff --git a/ojluni/src/main/native/PlainSocketImpl.c b/ojluni/src/main/native/PlainSocketImpl.c
index db25104..521a6ef 100755
--- a/ojluni/src/main/native/PlainSocketImpl.c
+++ b/ojluni/src/main/native/PlainSocketImpl.c
@@ -98,17 +98,8 @@
     return (*env)->GetIntField(env, fdObj, IO_fd_fdID);
 }
 
-/*
- * The initroto function is called whenever PlainSocketImpl is
- * loaded, to cache fieldIds for efficiency. This is called everytime
- * the Java class is loaded.
- *
- * Class:     java_net_PlainSocketImpl
- * Method:    initProto
- * Signature: ()V
- */
-JNIEXPORT void JNICALL
-PlainSocketImpl_initProto(JNIEnv *env, jclass cls) {
+static void PlainSocketImpl_initProto(JNIEnv *env) {
+    jclass cls = (*env)->FindClass(env, "java/net/PlainSocketImpl");
     psi_fdID = (*env)->GetFieldID(env, cls , "fd",
                                   "Ljava/io/FileDescriptor;");
     CHECK_NULL(psi_fdID);
@@ -1091,9 +1082,9 @@
   NATIVE_METHOD(PlainSocketImpl, socketBind, "(Ljava/net/InetAddress;I)V"),
   NATIVE_METHOD(PlainSocketImpl, socketConnect, "(Ljava/net/InetAddress;II)V"),
   NATIVE_METHOD(PlainSocketImpl, socketCreate, "(Z)V"),
-  NATIVE_METHOD(PlainSocketImpl, initProto, "()V"),
 };
 
 void register_java_net_PlainSocketImpl(JNIEnv* env) {
   jniRegisterNativeMethods(env, "java/net/PlainSocketImpl", gMethods, NELEM(gMethods));
+  PlainSocketImpl_initProto(env);
 }
diff --git a/ojluni/src/main/native/Register.cpp b/ojluni/src/main/native/Register.cpp
index 8e522d6..f1eb490 100644
--- a/ojluni/src/main/native/Register.cpp
+++ b/ojluni/src/main/native/Register.cpp
@@ -116,6 +116,19 @@
     register_sun_nio_ch_NativeThread(env);
     register_sun_nio_ch_FileKey(env);
     register_java_io_ObjectStreamClass(env);
+    register_java_lang_Character(env);
+    register_java_lang_Float(env);
+    register_java_lang_Double(env);
+    register_java_lang_StrictMath(env);
+    register_java_lang_Math(env);
+    register_java_lang_ProcessEnvironment(env);
+    register_java_lang_Runtime(env);
+    register_java_lang_System(env);
+    register_java_lang_Shutdown(env);
+    register_java_lang_UNIXProcess(env);
+    // register_java_net_InetAddress depends on java_lang_Float & Math being
+    // fully registered (getMethodId on InetAddress class triggers its
+    // <clinit> which depends on java.lang.Float)
     register_java_net_InetAddress(env);
     register_java_net_Inet4Address(env);
     register_java_net_Inet6Address(env);
@@ -127,16 +140,6 @@
     register_java_net_SocketInputStream(env);
     register_java_net_SocketOutputStream(env);
     register_java_nio_Bits(env);
-    register_java_lang_Character(env);
-    register_java_lang_Float(env);
-    register_java_lang_Double(env);
-    register_java_lang_StrictMath(env);
-    register_java_lang_Math(env);
-    register_java_lang_ProcessEnvironment(env);
-    register_java_lang_Runtime(env);
-    register_java_lang_System(env);
-    register_java_lang_Shutdown(env);
-    register_java_lang_UNIXProcess(env);
     register_java_util_prefs_FileSystemPreferences(env);
     register_sun_nio_ch_ServerSocketChannelImpl(env);
     register_sun_nio_ch_SocketChannelImpl(env);
diff --git a/ojluni/src/main/native/java_net_PlainSocketImpl.h b/ojluni/src/main/native/java_net_PlainSocketImpl.h
index 22bd59e..a7c14c5 100644
--- a/ojluni/src/main/native/java_net_PlainSocketImpl.h
+++ b/ojluni/src/main/native/java_net_PlainSocketImpl.h
@@ -102,13 +102,6 @@
 JNIEXPORT void JNICALL PlainSocketImpl_socketShutdown
   (JNIEnv *, jobject, jint);
 
-/*
- * Class:     java_net_PlainSocketImpl
- * Method:    initProto
- * Signature: ()V
- */
-JNIEXPORT void JNICALL PlainSocketImpl_initProto
-  (JNIEnv *, jclass);
 
 /*
  * Class:     java_net_PlainSocketImpl
diff --git a/ojluni/src/main/native/net_util.c b/ojluni/src/main/native/net_util.c
index c3acf0c..a656ed3 100755
--- a/ojluni/src/main/native/net_util.c
+++ b/ojluni/src/main/native/net_util.c
@@ -62,17 +62,6 @@
     return JNI_VERSION_1_2;
 }
 
-static int initialized = 0;
-
-static void initInetAddrs(JNIEnv *env) {
-    if (!initialized) {
-        InetAddress_init(env, 0);
-        Inet4Address_init(env, 0);
-        Inet6Address_init(env, 0);
-        initialized = 1;
-    }
-}
-
 /* The address, and family fields used to be in InetAddress
  * but are now in an implementation object. So, there is an extra
  * level of indirection to access them now.
@@ -85,28 +74,24 @@
 
 void setInetAddress_addr(JNIEnv *env, jobject iaObj, int address) {
     jobject holder;
-    initInetAddrs(env);
     holder = (*env)->GetObjectField(env, iaObj, ia_holderID);
     (*env)->SetIntField(env, holder, iac_addressID, address);
 }
 
 void setInetAddress_family(JNIEnv *env, jobject iaObj, int family) {
     jobject holder;
-    initInetAddrs(env);
     holder = (*env)->GetObjectField(env, iaObj, ia_holderID);
     (*env)->SetIntField(env, holder, iac_familyID, family);
 }
 
 void setInetAddress_hostName(JNIEnv *env, jobject iaObj, jobject host) {
     jobject holder;
-    initInetAddrs(env);
     holder = (*env)->GetObjectField(env, iaObj, ia_holderID);
     (*env)->SetObjectField(env, holder, iac_hostNameID, host);
 }
 
 int getInetAddress_addr(JNIEnv *env, jobject iaObj) {
     jobject holder;
-    initInetAddrs(env);
     holder = (*env)->GetObjectField(env, iaObj, ia_holderID);
     return (*env)->GetIntField(env, holder, iac_addressID);
 }
@@ -114,14 +99,12 @@
 int getInetAddress_family(JNIEnv *env, jobject iaObj) {
     jobject holder;
 
-    initInetAddrs(env);
     holder = (*env)->GetObjectField(env, iaObj, ia_holderID);
     return (*env)->GetIntField(env, holder, iac_familyID);
 }
 
 jobject getInetAddress_hostName(JNIEnv *env, jobject iaObj) {
     jobject holder;
-    initInetAddrs(env);
     holder = (*env)->GetObjectField(env, iaObj, ia_holderID);
     return (*env)->GetObjectField(env, holder, iac_hostNameID);
 }
@@ -129,7 +112,6 @@
 JNIEXPORT jobject JNICALL
 NET_SockaddrToInetAddress(JNIEnv *env, struct sockaddr *him, int *port) {
     jobject iaObj;
-    initInetAddrs(env);
 #ifdef AF_INET6
     if (him->sa_family == AF_INET6) {
         jbyteArray ipaddress;
diff --git a/ojluni/src/main/native/net_util.h b/ojluni/src/main/native/net_util.h
index 61302e2f..74e8089 100755
--- a/ojluni/src/main/native/net_util.h
+++ b/ojluni/src/main/native/net_util.h
@@ -103,10 +103,6 @@
 /************************************************************************
  *  Utilities
  */
-JNIEXPORT void JNICALL InetAddress_init(JNIEnv *env, jclass cls);
-JNIEXPORT void JNICALL Inet4Address_init(JNIEnv *env, jclass cls);
-JNIEXPORT void JNICALL Inet6Address_init(JNIEnv *env, jclass cls);
-JNIEXPORT void JNICALL NetworkInterface_init(JNIEnv *env, jclass cls);
 
 JNIEXPORT void JNICALL NET_ThrowNew(JNIEnv *env, int errorNum, char *msg);
 int NET_GetError();