Android培训班(71)Dex文件里类定义dvmDefineClass
发布日期:2021-07-01 05:06:18 浏览次数:2 分类:技术文章

本文共 1045 字,大约阅读时间需要 3 分钟。

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;

}

转载地址:https://mysoft.blog.csdn.net/article/details/6786803 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:MIT的《深度学习》精读(13)
下一篇:Android培训班(70)Dex文件里类定义dvmDefineClass

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月15日 12时23分43秒