众所周知导致JVM效率低下的一个原因是java程序必须经过interpreter的解析,
   同时JVM也提供了很多的API,这些API也是用Java语言写的,所以JVM在执行一个java程序时,除了要解析所要执行的class文件,还要解析本身的API。
  于是一个提高JVM效率的方法就是用native code(比如说C语言)来改写API,用Native关键字来修饰API里面的函数或者方法,再用C语言实现更改后的函数或者方法,然后将改写后的文件或者函数编译为可以在具体系统上执行的二进制代码,这样,KVM 在执行API时就可以直接执行二进制代码,而不用再解析API。  
  以上是我看到的文字,我不明白的是:
  我看了JVM附带的Java API的源代码,发现有些API里面的函数本身就是用native关键字修饰的,比如说 类java/lang/String.java, 它的equals 方法就是用关键字native定义,String.java里面就只有这么一行如下:
     public native boolean equals(Object anObject);
  然后发现它对应的实现在nativeCore.c里面,如下:
void Java_java_lang_String_equals() {
    OBJECT otherX = popStackAsType(OBJECT);
    STRING_INSTANCE this = popStackAsType(STRING_INSTANCE);
    bool_t result = FALSE;
    if ((OBJECT)this == otherX) {
        /* This case happens often enough that we should handle it quickly */
        result = TRUE;
    } else if ((otherX != NULL) && (otherX->ofClass == (CLASS)JavaLangString)){
        /* The other object must be a java.lang.String */
        STRING_INSTANCE other = (STRING_INSTANCE)otherX;
        unsigned long length = this->length;
        if (length == other->length) {
            /* Both objects must have the same length */
            if (0 == memcmp(&this->array->sdata[this->offset],
                            &other->array->sdata[other->offset],
                            length * sizeof(this->array->sdata[0]))) {
                /* Both objects must have the same characters */
                result = TRUE;
            }
        }
    }
    pushStack(result);
}
  那假如在一个test.class文件里面有对String.equals方法的调用的话,那KVM是加载整个String.clss类,然后再解析它的equals方法?
  但是按照上面的说法,应该是JVM不用解析String.class类就知道应该调用一个Java_java_lang_String_equals来实现,这样才能做到上面所说的绕开JVM的interpreter,直接调用本地的二进制文件。
  我的问题是:
      JVM对API中的native方法是怎样调用的?它是怎样绕过interpreter的?难道它不用解析String.class文件就知道要去调用Java_java_lang_String_equals来完成String.equals的功能?
     JVM加载一个class的时候是分阶段的,class的状态有:
     CLASS_RAW, CLASS_LOADING ,CLASS_LOADED,  CLASS_LINKED 四种,对Java_java_lang_String_equals的调用是在哪个阶段完成的?恳切盼望各位的回复,