在我的项目中,我想使用JNI-agent拦截java-static-native方法的结果。
我的基本方法是在绑定时将所有静态方法重新绑定到拦截器方法。拦截器方法将接受可变数量的参数,并在被调用时将它们转发到相应的静态函数。
这是一种合适的方法吗?现在在我的实现中,我努力将可变参数从拦截器函数转发到实际函数......
有没有人知道更好的方法呢?或者我是以一种过于复杂的方式做某事的?
答案 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 /类并设置一个它们被链接的布尔值。我是动态链接的,所以我需要在执行调用之前检查它们是否已设置。