1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| ... vm.setjni(this) ...
public class MyJNI extends AbstractJni{ @Override public DvmObject<?> callStaticxxxxxxMethodV(BaseVM vm, DvmClass dvmClass, String signature, VaList vaList) { switch (signature) { case "com/example/MyClass->getAppContext()Landroid/content/Context;": return vm.resolveClass("android/content/Context").newObject(null); default: return super.callStaticObjectMethodV(vm, dvmClass, signature, vaList); } } @Override public DvmObject<?> newObejectV(BaseVM vm, DvmClass dvmClass, String signature, VaList vaList) { switch (signature) { case "java/util/HashMap-><init>()V": { return ProxyDvmObject.createObject(vm, new HashMap<>()); } case "com/zj/wuaipojie/ui/ChallengeTen$UserInfo-><init>(Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;Lcom/zj/wuaipojie/ui/ChallengeTen$AccountStatus;Ljava/util/Map;)V": { System.out.println("【补环境 Level 3】拦截到 UserInfo 构造方法"); Map<String, DvmObject<?>> userInfoData = new HashMap<>(); userInfoData.put("status", vaList.getObjectArg(4)); userInfoData.put("properties", vaList.getObjectArg(5)); return dvmClass.newObject(userInfoData); } } return super.newObjectV(vm, dvmClass, signature, vaList); } @Override public DvmObject<?> getStaticObjectField(BaseVM vm, DvmClass dvmClass, String signature) { if ("com/zj/wuaipojie/ui/ChallengeTen$AccountStatus->PREMIUM:Lcom/zj/wuaipojie/ui/ChallengeTen$AccountStatus;".equals(signature)) { System.out.println("【补环境】拦截到获取 AccountStatus.PREMIUM 静态字段"); DvmObject<?> premium = dvmClass.newObject("PREMIUM"); return premium; } return super.getStaticObjectField(vm, dvmClass, signature); } @Override public void setIntField(BaseVM vm, DvmObject<?> dvmObject, String signature, int value) { if ("com/example/User->age:I".equals(signature)) { System.out.println("SO 正在设置 User 对象的 age 字段,值为: " + value); return; } super.setIntField(vm, dvmObject, signature, value); } }
|