1. 程式人生 > >Android在JNI層反射替換當前app的ClassLoader

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 clsSystemClassLoader  = env->FindClass("java/lang/ClassLoader$SystemClassLoader");
	jfieldID fSystemClassLoader  = env->GetStaticFieldID(clsSystemClassLoader, "loader", "Ljava/lang/ClassLoader;");
	jobject insSystemClassLoader = env->GetStaticObjectField(clsSystemClassLoader, fSystemClassLoader);
	LOGI("system loader = %p", insSystemClassLoader);

	env->SetObjectField(mPackageInfo, mClassLoaderFieldID, ...);
	env->SetStaticObjectField(clsSystemClassLoader, fSystemClassLoader, ...);
}

相關推薦

Android在JNI反射替換當前app的ClassLoader

值得一提的是,反射確實是個很強大很靈活的東西, 藉助雜湊、紅黑樹等高度優化的資料結構讓反射的代價降到了極低,通過反射+JNI, 可以做到幾乎任何你想做的東西。JNIEXPORT jint JNICALL JNI_OnL

Python_替換當前目錄下文件類型

html end style cnblogs 類型 .html print pos lena 1 ‘‘‘ 2 將當前目錄的所有擴展名為html的文件重命名為擴展名為htm的文件 3 方法一 4 ‘‘‘ 5 import os 6 file_list=os.li

反射_4.案例:使用反射替換對象所有字符串值

pre abc stack 所有 def 替換字符 rgs 類對象 for package com.day2; import java.lang.reflect.Field; public class T4_ReflectReplaceString { pub

MyBatis原始碼分析-2-基礎支援-反射模組-TypeParameterResolver/ObjectFactory

TypeParameterResolver: TypeParameterResolver的功能是:當存在複雜的繼承關係以及泛型定義時, TypeParameterResolver 可以幫助我們解析欄位、方法引數或方法返回值的型別。TypeParameterResolver 是在Refelctor

MyBatis原始碼分析-1-基礎支援-反射模組-Reflector/ReflectorFactory

本文主要介紹MyBatis的反射模組是如何實現的。 MyBatis 反射的核心類Reflector,下面我先說明它的建構函式和成員變數。具體方法下面詳解。 org.apache.ibatis.reflection.Reflector public class Reflector {

資料反射物件

using System; using System.Text; using System.Linq; using System.Collections.Generic; using System.Data; using System.Reflection; using Sy

火狐瀏覽器設定開啟書籤時新開標籤頁,不替換當前頁面

使用火狐瀏覽器,開啟儲存的書籤時,預設替換當前標籤頁,要新開標籤頁只有按住ctrl鍵再滑鼠點選書籤,感覺好不方便,今天就把這事給幹啦!安裝個外掛Tab Mix Plus就搞定啦,接下來就說說如何安裝這個外掛並如何設定。 1. 在瀏覽器右上角選單欄處選擇附加元件: 2. 搜

Mybatis框架基礎支持——反射工具箱之MetaClass(7)

odi zed span stat tor 沒有 對象 build ESS 簡介:MetaClass是Mybatis對類級別的元信息的封裝和處理,通過與屬性工具類的結合, 實現了對復雜表達式的解析,實現了獲取指定描述信息的功能 public class MetaCla

js 替換 當前URL 特定引數

//替換指定傳入引數的值,paramName為引數,replaceWith為新值 function replaceParamVal(paramName,replaceWith) { var oUrl = this.location.href.toString();

通過反射獲取當前Activity例項

步驟: 1、 獲取ActivityThread中儲存的所有的ActivityRecord 2 、從ActivityRecord中獲取狀態不是pause的Activity並返回,這個Activity

如果不是洛王在實力就進入這我願意替換一下我陪你

cab ebe d3d pve ddp via eba acf fcc http://baobao.baidu.com/article/0332225a510719d3ea42237a9f14b3b2.html?2017/10/04=kcotw9 http://baobao

UWP DEP0700: 應用程序註冊失敗。[0x80073CF9] 另一個用戶已安裝此應用的未打包版本。當前用戶無法將該版本替換為打包版本。

.cn 打包 ive 另一個 pan package 用戶 AC size 原文:UWP DEP0700: 應用程序註冊失敗。[0x80073CF9] 另一個用戶已安裝此應用的未打包版本。當前用戶無法將該版本替換為打包版本。最近電腦抽風,我在【應用程序和功能】中重置了以下我

Spring 通過定時器 通過反射 Resource Dao為空

技術分享 方法 img global getbean code oba 技術 需要 通過定時器,調用方法,方法中需要用到Dao層實體,Resource時為空 跟換Dao的註入方式: 從 Resource 改為 GlobalFunction.getBeanByName()即可

註解+反射+遞歸動態生成多XML

註解;遞歸;反射1.首先我們先創建一個xml的幫助類,這個幫助類不許要任何屬性,需要幫助實體類識別其他的成員實體類,代碼如下:註釋xml幫助類 import java.lang.annotation.Documented; import java.lang.annotation.ElementType; im

android java實現hook替換method

reflect 過程 ren pic [] hotfix mru andro bsp   Android上的熱修復框架 AndFix 大家都很熟悉了,它的原理實際上很簡單:   方法替換——Java層的每一個方法在虛擬機實現裏面都對應著一個ArtMethod的結構體,只要把

2018 反射呼叫service,@Resource注入失敗為空的解決方案

背景:            想利用反射動態呼叫service層的方法。實踐發現,反射呼叫service的方法後,@Resource注入的物件為空。 原因:          

反射呼叫Service方法,@Autowired註解失效。問題解決

反射呼叫方法時,裡面的dao層註解失敗。空指標異常。 原因很簡單,反射和new有點像。沒通過spring管理。 解決方案1: @Service public class service { @Autowired private Mapper mapper; //新

Revit二次開發之替換牆的構造資訊

UIDocument uidoc=commandData.Application.ActiveUIDocument;             Document doc=uidoc.Document;             Material material=new Fi

使用遞迴方法替換JSON裡面的內容(不管多少)-阿里的JSONObject

今天一同事問我json裡面的資料怎麼改 我一看 好像挺簡單的樣子,然後把json字串轉成JsonObject,然後再使用JsonObject的put方法,修改就可以類,的確很方便,但是如果json裡面還有json呢,這樣就不行了,還要一層一層挖,還得固定key值才行。所以,自己弄了個可以多個

ubuntu掛載其他分割槽到/home下,將當前分割槽內容替換

有時候,我們裝系統時,可能因為沒注意,把某一個分割槽分小了,導致到最後,我們的那個盤容不下了, 這時,面臨的兩個選擇就是:要麼解除安裝一些軟體,要麼重新分割槽,重灌系統,其實,還可以這樣,去把其他 多餘的盤分一個區出來,然後替換當前分割槽,放心,資料不會丟失,而且所有安