FindClass и GetMethodID не работают на Android JNI - PullRequest
1 голос
/ 05 декабря 2011

У меня есть c ++ lib, используемая с моим приложением. Я передал объект java jni и сохранил его для глобальной ссылки. Затем я хочу вызвать метод этого Java-объекта из jni из другого потока (я использую pthread).

Класс Java это:

public class WaitingServiceReadyCallback {
   public void ready(String serviceName) throws Exception { ... // some code }
}

Для вызова Java-метода я использую следующий код:

jvm->AttachCurrentThread(&env, 0);
cls = env->GetObjectClass(__obj__); // __obj__ is global reference to object.
if (!cls)
   goto detach;
mid = env->GetMethodID(cls, "ready", "(Ljava/lang/String;)V");

Там GetMethodID не удается найти метод. Когда я использую

cls = env->FindClass("com/mypackage/WaitingServiceReadyCallback");

вместо GetObjectClass, FindClass не может найти этот класс.

Я попытался проверить имя класса объекта referencd по моей глобальной ссылке __obj__ (использовался getName из com/java/Class, сделал вызов getName в том же месте моего кода, что и выше, вызов ready ), Я получил правильное название класса - com.mypackage.WaitingServiceReadyCallback.

Я уверен, что класс существует и загружен (код java, выполняемый до создания jni, и экземпляр этого класса там), я уверен, что метод существует в классе.

Итак, я не могу понять, что я сделал не так?

1 Ответ

2 голосов
/ 07 декабря 2011

Я встретил эту проблему.Причина вкратце: в другом потоке VM не предоставляет нам информацию о загруженных классах.Я решил эту проблему, сохранив загрузчик классов некоторого примера Java-объекта, а затем используя его для ручной загрузки необходимых классов из других потоков.

...