From 9e3a3ac2b2521c8a36562ac4e11fd9f1c0a6c4c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AE=8B=E9=A1=B5?= <31466456+canyie@users.noreply.github.com> Date: Sun, 10 Apr 2022 18:10:55 +0800 Subject: [PATCH] No need to implement Method.invoke ourselves (#1831) --- .../java/org/lsposed/lspd/nativebridge/HookBridge.java | 1 - core/src/main/jni/src/jni/hook_bridge.cpp | 9 +++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/org/lsposed/lspd/nativebridge/HookBridge.java b/core/src/main/java/org/lsposed/lspd/nativebridge/HookBridge.java index c174d286..34c5abd4 100644 --- a/core/src/main/java/org/lsposed/lspd/nativebridge/HookBridge.java +++ b/core/src/main/java/org/lsposed/lspd/nativebridge/HookBridge.java @@ -11,7 +11,6 @@ public class HookBridge { public static native boolean deoptimizeMethod(Executable method); - @FastNative public static native Object invokeOriginalMethod(Executable method, Object thisObject, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException; @FastNative diff --git a/core/src/main/jni/src/jni/hook_bridge.cpp b/core/src/main/jni/src/jni/hook_bridge.cpp index be07c2b1..115c8bc8 100644 --- a/core/src/main/jni/src/jni/hook_bridge.cpp +++ b/core/src/main/jni/src/jni/hook_bridge.cpp @@ -38,8 +38,7 @@ std::shared_mutex hooked_lock; // Rehashing invalidates iterators, changes ordering between elements, and changes which buckets elements appear in, but does not invalidate pointers or references to elements. std::unordered_map hooked_methods; -jobject (*native_invoke)(JNIEnv* env, jobject javaMethod, jobject javaReceiver, - jobjectArray javaArgs); +jmethodID invoke = nullptr; } namespace lspd { @@ -167,7 +166,7 @@ LSP_DEF_NATIVE_METHOD(jobject, HookBridge, invokeOriginalMethod, jobject hookMet if (hook_item && hook_item->backup) { to_call = hook_item->backup; } - return native_invoke(env, to_call, thiz, args); + return env->CallObjectMethod(to_call, invoke, thiz, args); } LSP_DEF_NATIVE_METHOD(jboolean, HookBridge, instanceOf, jobject object, jclass expected_class) { @@ -184,11 +183,9 @@ static JNINativeMethod gMethods[] = { void RegisterHookBridge(JNIEnv *env) { auto method = env->FindClass("java/lang/reflect/Method"); - auto invoke = env->GetMethodID( + invoke = env->GetMethodID( method, "invoke", "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;"); - native_invoke = reinterpret_cast( - lsplant::GetNativeFunction(env, env->ToReflectedMethod(method, invoke, false))); env->DeleteLocalRef(method); REGISTER_LSP_NATIVE_METHODS(HookBridge); }