Skip to content

Commit ce35291

Browse files
committed
Fix invoke original member "Wrong number of arguments" problem when hooking or called original function
1 parent 3e9f90e commit ce35291

File tree

4 files changed

+24
-12
lines changed

4 files changed

+24
-12
lines changed

yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/api/compat/HookCompatHelper.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ internal object HookCompatHelper {
113113
* @param args 参数实例
114114
* @return [Any] or null
115115
*/
116-
internal fun invokeOriginalMember(member: Member?, instance: Any?, vararg args: Any?): Any? {
116+
internal fun invokeOriginalMember(member: Member?, instance: Any?, args: Array<out Any?>?): Any? {
117117
if (member == null) return null
118118
return when (HookApiCategoryHelper.currentCategory) {
119119
HookApiCategory.ROVO89_XPOSED -> XposedBridge.invokeOriginalMethod(member, instance, args)

yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/api/helper/YukiHookHelper.kt

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,22 +76,32 @@ internal object YukiHookHelper {
7676
}
7777
}
7878

79+
/**
80+
* 获取当前 [Member] 是否被 Hook
81+
* @param member 实例
82+
* @return [Boolean]
83+
*/
84+
internal fun isMemberHooked(member: Member?): Boolean {
85+
if (member == null) return false
86+
return HookApiCategoryHelper.hasAvailableHookApi && YukiHookCacheStore.hookedMembers.any { it.member.toString() == member.toString() }
87+
}
88+
7989
/**
8090
* 执行原始 [Member]
8191
*
8292
* 未进行 Hook 的 [Member]
8393
* @param member 实例
8494
* @param args 参数实例
8595
* @return [Any] or null
96+
* @throws IllegalStateException 如果 [Member] 参数个数不正确
8697
*/
87-
internal fun invokeOriginalMember(member: Member?, instance: Any?, vararg args: Any?) =
88-
if (HookApiCategoryHelper.hasAvailableHookApi && YukiHookCacheStore.hookedMembers.any { it.member.toString() == member.toString() })
89-
member?.let {
90-
runCatching { HookCompatHelper.invokeOriginalMember(member, instance, args) }
91-
.onFailure { yLoggerE(msg = "Invoke original Member [$member] failed", e = it) }
92-
.getOrNull()
93-
}
94-
else null
98+
internal fun invokeOriginalMember(member: Member?, instance: Any?, args: Array<out Any?>?) =
99+
if (isMemberHooked(member)) member?.let {
100+
runCatching { HookCompatHelper.invokeOriginalMember(member, instance, args) }.onFailure {
101+
if (it.message?.lowercase()?.contains("wrong number of arguments") == true) error(it.message ?: it.toString())
102+
yLoggerE(msg = "Invoke original Member [$member] failed", e = it)
103+
}.getOrNull()
104+
} else null
95105

96106
/**
97107
* 使用当前 Hook API 自带的日志功能打印日志

yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -702,8 +702,8 @@ class MethodFinder @PublishedApi internal constructor(
702702
* @return [Any] or null
703703
*/
704704
private fun baseCall(vararg param: Any?) =
705-
if (isCallOriginal)
706-
method?.let { YukiHookHelper.invokeOriginalMember(it, instance, *param) ?: it.invoke(instance, *param) }
705+
if (isCallOriginal && YukiHookHelper.isMemberHooked(method))
706+
YukiHookHelper.invokeOriginalMember(method, instance, param)
707707
else method?.invoke(instance, *param)
708708

709709
/**

yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/HookParam.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ class HookParam internal constructor(
8787
*/
8888
val args get() = param?.args ?: error("Current hooked Member args is null")
8989

90+
//val instanceOrNull?
91+
9092
/**
9193
* 获取当前 Hook 实例的对象
9294
*
@@ -231,7 +233,7 @@ class HookParam internal constructor(
231233
* @return [T] or null
232234
*/
233235
@JvmName(name = "invokeOriginal_Generics")
234-
fun <T> invokeOriginal(vararg args: Any?) = YukiHookHelper.invokeOriginalMember(member, param?.instance, *args) as T?
236+
fun <T> invokeOriginal(vararg args: Any?) = YukiHookHelper.invokeOriginalMember(member, param?.instance, args) as T?
235237

236238
/**
237239
* 设置当前 Hook 对象方法的 [result] 返回值为 true

0 commit comments

Comments
 (0)