Очистка JNI и потоки демонов в Android NDK


Таков поток JNI

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

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

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

Ну вопросы являются:

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

1 ответ:

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

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

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

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

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

Удачи!