Android平台在JNI层实现动态dex分包加载

本文探讨了如何在Android平台上利用JNI层实现动态的dex分包加载。通过利用ClassLoader的双亲委派机制,可以确保在不重复加载的情况下实现类的动态加载。
摘要由CSDN通过智能技术生成
        为了完成类的加载, Android平台目前提供了两类ClassLoader, 分别为 dalvik.system.DexClassLoader 和 dalvik.system.PathClassLoader, 主要区别在于后者不需要指定用于保存优化结果的缓存目录, 但由于在Dalvik虚拟机下dexopt是强制执行的, 故而只支持加载系统类或已安装的app, 因为可从 dalvik-cache缓存目录中直接读取到相应的优化文件, ART下dex2oat支持回退, 故而也可加载未安装的文件, 从而没有了Dalvik下的限制; 前者 DexClassLoader 则需要额外指定一个可写的 私有缓存目录, 支持加载任意本地 .dex文件以及包含 .dex 的 .apk、.jar、.zip文件。

        此外, Android平台的ClassLoader同样具有双亲委派特性, 在加载类前, 会先检查父加载器是否已经加载过同一个类, 利用这些特性我们可以轻易实现 .dex 的动态分包加载。

#pragma once
#include <jni.h>
#ifndef	__selectany
# define __selectany __attribute__((weak))
#endif // __selectany

//-------------------------------------------------------------------------

class DexClassLoader
{
	// dalvik/system/DexClassLoader
	static jclass    clsDexClassLoader_;
	static jmethodID loadClass_;
	static jmethodID constructor_;
	// android/content/Context
	static jmethodID getClassLoader_;
	// java/lang/ClassLoader
	static jcl
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值