Если вы полагаетесь на код в методе finalize
для запуска в определенное время, вам необходимо пересмотреть свой подход. Проблема в том, что вы не знаете, когда JVM будет вызывать finalize
, поскольку вы не знаете, когда объект будет собирать мусор.
Одна вещь, которую вы должны учитывать, поскольку ваш класс будет повторно использоваться в других проектах, это то, что конечный пользователь может использовать экземпляр класса таким образом, что он не будет собран, или что сборка мусора будет маловероятной, например, создание статической ссылки на экземпляр класса. Я думаю, что создание метода close
или destroy
- это ваша самая безопасная ставка, чтобы гарантировать, что ресурсы экземпляра класса C ++, связанного с вашим объектом Java, будут освобождены соответствующим образом.
Поскольку повторное использование является проблемой, вы могли бы проверить деструктор C ++, чтобы увидеть, были ли освобождены ресурсы, и вызвать тот же код, если они не были, например:
class MyThing {
public:
void close();
~MyThing();
private:
bool released = false;
};
void
MyThing::close() {
// close logic here
this->released = true;
}
MyThing::~MyThing() {
if (!released) {
this->close();
}
}
Таким образом, ваш существующий код C ++, надеюсь, не будет сильно меняться, и вы можете гарантировать, что ваши ресурсы будут освобождены детерминистическим способом в контексте нативного кода, выполняемого через JNI.