【问题标题】:JNI native static method interceptionJNI原生静态方法拦截
【发布时间】:2017-05-15 13:14:01
【问题描述】:

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

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

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

(c++ forward function call)

有没有人知道更好的方法?还是我用一种过于复杂的方式做某事?

【问题讨论】:

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


【解决方案1】:

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 函数后,我将回调到活动/类并设置一个布尔值,表明它们已链接。我正在动态链接,所以我需要在执行调用之前检查它们是否已设置。

【讨论】:

  • 我的目标是拦截所有方法,因此我将所有本机方法重新绑定到我的拦截器方法。我的拦截器在调用时能够查找最初调用方法的 jmethod id ...它还可以找到原始方法的内存地址,但是它不能调用它,因为这需要以通用方式完成,我还没有找到解决方案
猜你喜欢
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
相关资源
最近更新 更多