mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-04 09:45:19 +08:00
Fix invoke original member "Wrong number of arguments" problem when hooking or called original function
This commit is contained in:
@@ -113,7 +113,7 @@ internal object HookCompatHelper {
|
||||
* @param args 参数实例
|
||||
* @return [Any] or null
|
||||
*/
|
||||
internal fun invokeOriginalMember(member: Member?, instance: Any?, vararg args: Any?): Any? {
|
||||
internal fun invokeOriginalMember(member: Member?, instance: Any?, args: Array<out Any?>?): Any? {
|
||||
if (member == null) return null
|
||||
return when (HookApiCategoryHelper.currentCategory) {
|
||||
HookApiCategory.ROVO89_XPOSED -> XposedBridge.invokeOriginalMethod(member, instance, args)
|
||||
|
@@ -76,6 +76,16 @@ internal object YukiHookHelper {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前 [Member] 是否被 Hook
|
||||
* @param member 实例
|
||||
* @return [Boolean]
|
||||
*/
|
||||
internal fun isMemberHooked(member: Member?): Boolean {
|
||||
if (member == null) return false
|
||||
return HookApiCategoryHelper.hasAvailableHookApi && YukiHookCacheStore.hookedMembers.any { it.member.toString() == member.toString() }
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行原始 [Member]
|
||||
*
|
||||
@@ -83,15 +93,15 @@ internal object YukiHookHelper {
|
||||
* @param member 实例
|
||||
* @param args 参数实例
|
||||
* @return [Any] or null
|
||||
* @throws IllegalStateException 如果 [Member] 参数个数不正确
|
||||
*/
|
||||
internal fun invokeOriginalMember(member: Member?, instance: Any?, vararg args: Any?) =
|
||||
if (HookApiCategoryHelper.hasAvailableHookApi && YukiHookCacheStore.hookedMembers.any { it.member.toString() == member.toString() })
|
||||
member?.let {
|
||||
runCatching { HookCompatHelper.invokeOriginalMember(member, instance, args) }
|
||||
.onFailure { yLoggerE(msg = "Invoke original Member [$member] failed", e = it) }
|
||||
.getOrNull()
|
||||
}
|
||||
else null
|
||||
internal fun invokeOriginalMember(member: Member?, instance: Any?, args: Array<out Any?>?) =
|
||||
if (isMemberHooked(member)) member?.let {
|
||||
runCatching { HookCompatHelper.invokeOriginalMember(member, instance, args) }.onFailure {
|
||||
if (it.message?.lowercase()?.contains("wrong number of arguments") == true) error(it.message ?: it.toString())
|
||||
yLoggerE(msg = "Invoke original Member [$member] failed", e = it)
|
||||
}.getOrNull()
|
||||
} else null
|
||||
|
||||
/**
|
||||
* 使用当前 Hook API 自带的日志功能打印日志
|
||||
|
@@ -702,8 +702,8 @@ class MethodFinder @PublishedApi internal constructor(
|
||||
* @return [Any] or null
|
||||
*/
|
||||
private fun baseCall(vararg param: Any?) =
|
||||
if (isCallOriginal)
|
||||
method?.let { YukiHookHelper.invokeOriginalMember(it, instance, *param) ?: it.invoke(instance, *param) }
|
||||
if (isCallOriginal && YukiHookHelper.isMemberHooked(method))
|
||||
YukiHookHelper.invokeOriginalMember(method, instance, param)
|
||||
else method?.invoke(instance, *param)
|
||||
|
||||
/**
|
||||
|
@@ -87,6 +87,8 @@ class HookParam internal constructor(
|
||||
*/
|
||||
val args get() = param?.args ?: error("Current hooked Member args is null")
|
||||
|
||||
//val instanceOrNull?
|
||||
|
||||
/**
|
||||
* 获取当前 Hook 实例的对象
|
||||
*
|
||||
@@ -231,7 +233,7 @@ class HookParam internal constructor(
|
||||
* @return [T] or null
|
||||
*/
|
||||
@JvmName(name = "invokeOriginal_Generics")
|
||||
fun <T> invokeOriginal(vararg args: Any?) = YukiHookHelper.invokeOriginalMember(member, param?.instance, *args) as T?
|
||||
fun <T> invokeOriginal(vararg args: Any?) = YukiHookHelper.invokeOriginalMember(member, param?.instance, args) as T?
|
||||
|
||||
/**
|
||||
* 设置当前 Hook 对象方法的 [result] 返回值为 true
|
||||
|
Reference in New Issue
Block a user