Android — JNI: правильно управлять временем жизни Java-объекта

Когда я создаю нативный узел реализации в c ++, как я могу гарантировать, что нативная часть также удаляется при удалении java-объекта JVM? Я могу добавить некоторые методы, которые пользователь java-объекта должен вызывать явно, но я хотел бы знать, есть ли какой-то хук, который я мог бы обработать, когда java-объект удален (сборщик мусора), чтобы я мог автоматически удалить объект реализации c ++ также.

Я просмотрел JACE кажется, что он это делает, но мне нужно запустить PeerEnhancer для исправления сгенерированного файла класса (возможно, именно так он перехватывает удаление? или, возможно, ему нужно это исправление для чего-то другого). Тем не менее, я хотел бы избежать возни скомпилированных файлов Java, я не хочу ничего фантастического

2

Решение

Это редкий случай, когда вы действительно должны использовать финализатор, но вы также должны сделать свой класс Java Closeable.

2

Другие решения

Имейте в виду, что, принимая финализаторы, вы щекочете JVM в худшем из возможных мест. Вызов JNI в финализаторе () подобен регулировке фаз газораспределения двигателя во время движения. Хотя это технически возможно, также очень легко закончить с утечкой JVM или сбоем. Даже при малейшем прикосновении к многопоточности вы наверняка будете в тупике / сбое. Если вы скажете «я не хочу ничего фантастического», я бы предложил использовать явно вызванные методы. Да, требование определенного порядка методов по соглашению — грязный дизайн, но тогда JNI вообще грязный.

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

http://asserttrue.blogspot.com/2008/11/finalization-is-evil.html

http://elliottback.com/wp/java-memory-leaks-w-finalize-examples/

Мое предложение: да, реализовать базовый класс с помощью виртуального метода detachFromPeer (), установить в нем какой-либо «отдельный» флаг, а затем в финализаторе просто проверить флаг с некоторым предупреждением.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector