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