我试图从另一个方法的本机实现中调用私有方法,如下所示:
jclass cls = (*env)->GetObjectClass(env, obj);
jmethodID output_mid = (*env)->GetMethodID(env, cls, "methodName", "(Ljava/lang/String;)V");
if (output_mid == 0)
{
// Exit
}
这给了我一个“找不到方法”的例外。从我收集的内容来看,类对象必须对应于定义目标方法的类,因为它是私有的。
确实,如果我将访问修饰符更改为protected,则错误消失。同样从日志中,我看到GetObjectClass返回了运行时类,而不是基类。所以,我的问题是:如何在JNI中获得正确的基类?
答案 0 :(得分:3)
在这种情况下,您可以使用JNI函数getSuperClass()
来获取正确的类。在知道在某些超类中定义私有方法的一般情况下,您可能需要遍历继承树,将每个超类检查到根目录。