JNI:获取超类中私有方法的方法ID

Pan*_*sis 3 c java methods java-native-interface

我试图从另一个方法的本机实现中调用私有方法,如下所示:

jclass cls = (*env)->GetObjectClass(env, obj);
jmethodID output_mid = (*env)->GetMethodID(env, cls, "methodName", "(Ljava/lang/String;)V");
if (output_mid == 0)
{
    // Exit
}
Run Code Online (Sandbox Code Playgroud)

这给了我一个“找不到方法”的异常。据我所知,类对象必须与定义目标方法的类相对应,因为它是私有的。

事实上,如果我将访问修饰符更改为 protected,错误就会消失。另外从日志中,我看到 GetObjectClass 返回了运行时类,而不是基类。所以,我的问题是:如何在 JNI 中获取正确的基类?

Ern*_*ill 5

在这种情况下,您可以使用一个 JNI 函数getSuperClass()来获取正确的类。在知道某个超类中定义了私有方法的一般情况下,您可能需要遍历继承树检查每个超类直至根。