JNI: получение идентификатора метода для частного метода в суперклассе - PullRequest
2 голосов
/ 11 марта 2012

Я пытаюсь вызвать закрытый метод из собственной реализации другого метода, подобного этому:

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

Это дает мне исключение "метод не найден".Из того, что я понял, объект класса должен соответствовать классу, в котором был определен целевой метод, поскольку он является закрытым.

Действительно, если я изменю модификатор доступа на защищенный, ошибка исчезнет.Также из журналов я вижу, что GetObjectClass возвращает класс времени выполнения, а не базовый класс.Итак, мой вопрос: как получить правильный базовый класс в JNI?

1 Ответ

3 голосов
/ 11 марта 2012

Есть функция JNI getSuperClass(), которую вы можете использовать для получения правильного класса в этом случае.В общем случае, если вы знаете, что закрытый метод определен в некотором суперклассе, вам может потребоваться пройти дерево наследования, проверяя каждый суперкласс до корня.

...