clazz= dvmLookupClass(descriptor, loader, true);
if(clazz == NULL) {
constDexClassDef*pClassDef;
这段代码是调用函数dvmLookupClass在已经加载的类里查找是否已经存在,如果已经存在,就直接使用就可以了。否则,就需要从Dex文件里读取出来。
#ifdefWITH_PROFILER
dvmMethodTraceClassPrepBegin();
profilerNotified = true;
#endif
#ifLOG_CLASS_LOADING
u8 startTime =dvmGetThreadCpuTimeNsec();
#endif
if(pDvmDex == NULL) {
assert(loader ==NULL); /* shouldn't be hereotherwise */
pDvmDex =searchBootPathForClass(descriptor, &pClassDef);
这段代码是当判断输入的参数Dex文件为空时,说明需要从系统缺省的库目录里加载,就是调用searchBootPathForClass函数去查找相应的类,并返回这个类的Dex文件对象。
} else{
pClassDef =dexFindClass(pDvmDex->pDexFile,descriptor);
这行代码是当指定从Dex文件加载时,就调用函数dexFindClass从文件查找相应的类。
}
if(pDvmDex == NULL || pClassDef == NULL) {
if(gDvm.noClassDefFoundErrorObj!= NULL) {
/*usual case -- use prefabricatedobject */
dvmSetException(self,gDvm.noClassDefFoundErrorObj);
这段代码是判断是否加载出错,如果出错就设置异常返回。
} else{
/*dexoptcase -- can't guarantee prefab(core.jar) */
dvmThrowExceptionWithClassMessage(
"Ljava/lang/NoClassDefFoundError;",descriptor);
}
这里都没有办法加载到指定类出错返回。
gotobail;
}