首页
社区
课程
招聘
[求助] Dalvik虚拟机中,dvmDecodeIndirectRef 将间接引用转换成对象引用是怎么回事?
发表于: 2018-10-1 23:41 4360

[求助] Dalvik虚拟机中,dvmDecodeIndirectRef 将间接引用转换成对象引用是怎么回事?

2018-10-1 23:41
4360
   在学习xposed原理过程中,又遇见Object* dvmDecodeIndirectRef(Thread* self, jobject jobj)这个函数,
  这个函数代码是这样注释的:
/*
 * Convert an indirect reference to an Object reference.  The indirect
 * reference may be local, global, or weak-global.
 *
 * If "jobj" is NULL, or is a weak global reference whose reference has
 * been cleared, this returns NULL.  If jobj is an invalid indirect
 * reference, kInvalidIndirectRefObject is returned.
 *
 * Note "env" may be NULL when decoding global references.
 */
如果 jobject 是一个jclass对象,该函数返回一个ClassObject对象的引用。
如果是一个普通的jobject ,例如XposedBridge_hookMethodNative方法中jobject additionalInfoIndirect对象
  hookInfo->reflectedMethod = dvmDecodeIndirectRef(dvmThreadSelf(), env->NewGlobalRef(reflectedMethodIndirect));
    hookInfo->additionalInfo = dvmDecodeIndirectRef(dvmThreadSelf(), env->NewGlobalRef(additionalInfoIndirect));//additionalInfo 变为对象引用
在转换成对象引用后,作为参数再传给methodXposedBridgeHandleHookedMethod方法为什仍然java层可以直接调用,它不是已经成为对象引用了?并没有变回间接引用,对象引用和间接引用有什么区别?哪位大佬帮小弟解一下疑惑呀,谢谢
  // call the Java handler function
    JValue result;
    dvmCallMethod(self, (Method*) methodXposedBridgeHandleHookedMethod, NULL, &result,
        originalReflected, (int) original, additionalInfo, thisObject, argsArray);  //additionalInfo为对象引用




private static Object handleHookedMethod(Member method, int originalMethodId, Object additionalInfoObj,
			Object thisObject, Object[] args) throws Throwable {
		AdditionalHookInfo additionalInfo = (AdditionalHookInfo) additionalInfoObj;  //为什么对象引用可以在java层直接调用,而不用变为间接引用?

		if (disableHooks) {
			try {
				return invokeOriginalMethodNative(method, originalMethodId, additionalInfo.parameterTypes,
						additionalInfo.returnType, thisObject, args);
			} catch (InvocationTargetException e) {
				throw e.getCause();
			}
		}
.......
}


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2018-10-3 20:59 被倔强石头编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
对象引用是对象在内存中的实际指针, 在JNI交互过程直接暴露对象引用显然不安全, 从而有了间接引用, 它是JNI引用表的特殊索引, 使用间接引用也使GC具备了移动对象的能力。
间接引用是针对JNI交互过程而言的, 在VM内部使用的当然还是对象引用, 如果不是JNI方法是不需要变回间接引用的。
dvmCallMethod实质调用dvmCallMethodV, 并且后者参数bool fromJni被指定为false, 说明dvmCallMethod仅接受对象引用, 剩下的就是VM内部处理的事了。
2018-10-3 16:31
0
雪    币: 154
活跃值: (602)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
rrrfff 对象引用是对象在内存中的实际指针, 在JNI交互过程直接暴露对象引用显然不安全, 从而有了间接引用, 它是JNI引用表的特殊索引, 使用间接引用也使GC具备了移动对象的能力。 间接引用是针对JNI交 ...
哦,好像明白了点。dvmCallMethodV方法的bool fromJni参数直接决定JNI方法中的间接引用是否转换成对象引用。而Dalvik虚拟内部使用的对象仍然是对象引用。万分感谢!
2018-10-3 22:33
0
游客
登录 | 注册 方可回帖
返回
//