在我的项目中,我想使用JNI-agent来拦截java-static-native方法的结果。
我的基本方法是在绑定时将所有静态方法重新绑定到我的拦截器方法。拦截器方法将接受不同数量的参数,并在被调用时将它们转发给相应的静态函数。
这是一种合适的方法吗?现在,在我的实现中,我很难将截取函数中的变量参数转发给实际的函数……
有没有人有更好的方法呢?或者我正在以一种过于复杂的方式做一些事情?
发布于 2017-05-15 22:33:30
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函数后,我将回调到活动/类中,并设置一个布尔值,表明它们是链接的。我是动态链接的,所以我需要在执行调用之前检查是否设置了它们。
https://stackoverflow.com/questions/43980545
复制相似问题