Очистка JNI и потоки демонов в Android NDK - PullRequest
2 голосов
/ 10 марта 2012

Так вот поток JNI

JNI_onLoad - получить JavaVM (получить jclass для вызова статических методов)

Затем нужно вызвать что-тоиз Java в C:

GetEnv () для получения JNIEnv и AttachCurrentThread () для его использования.
Вызов метода java
Обработать возвращаемое значение методом java.
DetachCurrentThread () - свободная нить
Где-то в конце
DestroyJavaVM ()

Хорошие вопросыявляются:

  1. Там, чтобы вызвать DestroyJavaVM (), и если мне нужно сделать это?В onDestroy () в моей основной деятельности?
  2. Является ли JNI_onUnload когда-либо звонить и что я должен там убрать?
  3. Нужно ли мне как-нибудь бесплатно jclass , который я хранил в статической глобальной переменной vaiable?
  4. Делает ли JNI свободными локальные элементы из области jarrays / jarrays, строки и строковые символы, рабочие объекты после функциивернуть или я всегда должен следить за этим (вызывая env-> Release (что-то))
  5. Что такое преимущества и использование AttachCurrentThreadAsDaemon () ?

1 Ответ

2 голосов
/ 10 марта 2012
  1. DestroyJavaVM () должен вызываться, когда вы больше не используете JVM (возможно, в конце вашей программы).

  2. JNI_onUnload вызывается, когда классвыгружен (потому что его загрузчик классов был удален, например).

  3. , чтобы освободить класс, обнулить его ссылки и удалить его загрузчик классов.

  4. JNIэлементы jarrays / jarrays, строки и объекты заданий либо выделяются JVM, либо используют буфер C (которым вы управляете);см. № 3 для первого случая.

  5. AttachCurrentThreadAsDaemon () сообщает JVM, что он не должен ждать завершения потока при завершении работы (полезно для демонов).

Удачи!

...