2010-12-03 5 views
4

У меня есть ниже фрагмент кода в моей части JNI:AndroidRuntime :: getJNIEnv() возвращает NULL

JNIEnv* env = AndroidRuntime::getJNIEnv(); 

Приведенное выше утверждение всегда возвращает NULL в моей функции. Затем я использую env и вызываю некоторый метод в Java-коде, используя механизм обратного вызова.

Именно эта часть кода в getJNIEnv() всегда возвращает NULL.

if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) 
{ 
     return NULL; 
} 

Может кто-нибудь скажет мне, что не так с кодом? Это выглядит довольно нормально для меня, поскольку другие функции в JNI тоже имеют почти аналогичную реализацию.

ответ

7

Во-первых, не используйте AndroidRuntime::getJNIEnv(). Это не является частью API NDK. Вместо этого вы должны использовать функцию JNI GetEnv.

Во-вторых, GetEnv возвращает NULL, если текущий поток не подключен к виртуальной машине. (Помните, что JNIEnv относится к потоку.) Если вы создали поток самостоятельно, вам нужно будет использовать функцию JNI AttachCurrentThread для ее присоединения.

Для обоих из них требуется указатель JavaVM. Там только один из них в процессе, так что вы можете получить его в течение JNI_OnLoad или вызов настройки из вашей программы (GetJavaVM функция), когда у вас есть JNIEnv прошли в.

Если вы еще не, прочитать JNI Tips страницы (который включает ссылки на некоторые всеобъемлющие документы JNI).

Смежные вопросы