Android培训班(71)Dex文件里类定义dvmDefineClass

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;

}

你可能感兴趣的:(Android培训班(71)Dex文件里类定义dvmDefineClass)