JNI本机静态方法拦截

时间:2017-05-15 13:14:02

标签: c++ java-native-interface jvmti

在我的项目中,我想使用JNI-agent拦截java-static-native方法的结果。

我的基本方法是在绑定时将所有静态方法重新绑定到拦截器方法。拦截器方法将接受可变数量的参数,并在被调用时将它们转发到相应的静态函数。

这是一种合适的方法吗?现在在我的实现中,我努力将可变参数从拦截器函数转发到实际函数......

c++ forward function call

有没有人知道更好的方法呢?或者我是以一种过于复杂的方式做某事的?

1 个答案:

答案 0 :(得分:0)

va_arg不会为您提供参数的类型信息。充其量,您将获得参数计数,如果您的所有函数都有不同的参数计数(除了JNIEnv*jclass),那么您将能够使其工作。

如果要拦截特定方法,则可以构建拦截方法表。只需使用JavaH生成存根,根据需要使用重命名,然后构建JNINativeMethod表。

static JNINativeMethod JVM_Methods[] =
{
   // grab function names and signatures from JavaH stubs
   {"OnDeepLink",    "(Ljava/lang/String;)V",    (void*)& JNI_OnDeepLink},
   ...
};
int JVM_Methods_Count = N;

// register your overrides
jint nRes = g_env->RegisterNatives(activity, JVM_Methods, JVM_Methods_Count);

另外,我有一个小技巧,在我注册C函数后,我将回调到activity /类并设置一个它们被链接的布尔值。我是动态链接的,所以我需要在执行调用之前检查它们是否已设置。