Проблема удаления локальных ссылок Java в библиотеке классов C ++ с использованием API вызова JNI

Заранее извиняюсь за длинный пост. Я использую API вызова JNI для использования библиотеки Java. Я обернул код JNI в библиотеку классов C ++. В моем main() Функция у меня есть следующий цикл:

for(date CURRENT_DATE = START_DATE; CURRENT_DATE.COMPARE_TO(END_DATE) <= 0; CURRENT_DATE.SHIFT_SELF(TIMESTEP))
{
CURRENT_STATE = Propagator.PROPAGATE(CURRENT_DATE);  //ISSUES WITH DESTRUCTOR
output::to_OUTPUT_FILE(CURRENT_STATE,"OutputFile.txt");
}

У меня проблема с управлением памятью при попытке освободить локальные ссылки на объекты Java в деструкторе моего state учебный класс. По существу, ссылка на объект java удаляется и не может использоваться при повторном назначении, когда вызывается оператор назначения копирования.

Чтобы описать это немного подробнее, мой деструктор выглядит примерно так:

state::~state()
{
if(DOES_JVM_EXIST())
{
ENV->DeleteLocalRef(this->jobj_STATE);
}
}

и оператор присваивания:

state& state::operator =(const state& state_to_copy)
{
this->ENV = ENV;
this->jobj_STATE = ENV->AllocObject(this->jcls_STATE);
this->jobj_STATE = state_to_copy.get_STATE_JOBJECT();

return *this;
}

propagator::PROPAGATE() метод возвращает state объект:

state propagator::PROPAGATE(date & TargetDate)
{
jobject jobj_PROPAGATED_STATE = ENV->CallObjectMethod(this->jobj_PROPAGATOR, jmid_PROPAGATE, TargetDate.get_DATE_JOBJECT());
state PROPAGATED_STATE(this->ENV);
PROPAGATED_STATE.set_STATE_JOBJECT(jobj_PROPAGATED_STATE);
return PROPAGATED_STATE;
}

Проблема в том, что когда Propagator.PROPAGATE() возвращается, деструктор вызывается и удаляет ссылку на jobj_PROPAGATED_STATE в JVM. Это означает, что при переназначении CURRENT_STATE через оператор присваивания копии цикл завершается сбоем, поскольку ссылка на объект задания больше не существует.

Как именно можно попытаться подойти к этой проблеме, чтобы циклы работали, а также чтобы был удален рабочий объект jobj_state?

0

Решение

Задача ещё не решена.

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

Других решений пока нет …

По вопросам рекламы [email protected]