Android在JNI层反射替换当前app的ClassLoader

值得一提的是,反射确实是个很强大很灵活的东西, 借助哈希、红黑树等高度优化的数据结构让反射的代价降到了极低,通过反射+JNI, 可以做到几乎任何你想做的东西。
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *unused)
{
	JNIEnv *env;
	jvm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6);

	jclass clsContextImpl        = env->FindClass("android/app/ContextImpl");
	jfieldID mPackageInfoFieldID = env->GetFieldID(clsContextImpl, "mPackageInfo", "Landroid/app/LoadedApk;");
	jobject mPackageInfo         = env->GetObjectField(ActivityThread::getSystemContext(env), mPackageInfoFieldID);
	jclass mPackageInfoClass     = env->GetObjectClass(mPackageInfo);
	jfieldID mClassLoaderFieldID = env->GetFieldID(mPackageInfoClass, "mClassLoader", "Ljava/lang/ClassLoader;");
	jobject mClassLoader         = env->GetObjectField(mPackageInfo, mClassLoaderFieldID);
	LOGI("original loader = %p", mClassLoader);

	jclass clsS
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值