Перезапуск в Android NDK раздражает. Любые статические данные, которые у вас есть, задерживаются, потому что они повторно используют процесс, поэтому вам нужно вручную сбросить все, что будет недопустимым при новом запуске (например, любые объекты текстуры OpenGL или буфера вершин). Он дает вам новый поток Java, а также новое приложение Java и другие объекты, поэтому любые кэшированные глобальные ссылки на объекты, которые будут новыми в новом экземпляре вашего приложения, также необходимо очистить.
Таким образом, стратегия, которую я использую, имеет два аспекта: минимизировать перезапуски и уничтожать все при перезапуске.
Вы минимизируете перезапуски, обрабатывая в приложении configChanges, как сказано в ответе на вопрос, который вы связали. Тогда открытие клавиатуры или вращение не вызывают перезапуск приложения, как это должно быть для любого приложения с нетривиальным временем запуска.
И когда я обнаруживаю, что новый экземпляр моего приложения запущен, я освобождаю все критически важные от старого экземпляра в тот момент, включая освобождение любых объектов Java, которые я держал через NewGlobalRef. Я пытался минимизировать статические данные, но в нескольких неизбежных местах, где я храню статические объекты, я очищаю их при обнаружении запуска нового экземпляра.
Старые потоки должны исчезнуть, как только на них больше не останется выдающихся ссылок (т. Е. После того, как вы освободите все свои объекты NewGlobalRef).