Проблема удаления локальных ссылок Java в библиотеке классов C ++ с использованием API вызова JNI - PullRequest
0 голосов
/ 06 ноября 2018

Заранее извиняюсь за длинный пост. Я использую 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?

...