使用JNI调用API删除C ++类库中的本地Java引用时出现问题

时间:2018-11-06 11:12:12

标签: java c++ java-native-interface destructor invocation-api

提前道歉。我正在使用JNI调用API来利用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");
}

我遇到的问题与内存管理有关,该内存管理试图在我的state类的析构函数中释放对Java对象的本地引用。本质上,对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()返回时,析构函数将被调用并删除对JVM中对jobj_PROPAGATED_STATE的引用。这意味着,当通过复制分配操作符重新分配CURRENT_STATE时,循环将失败,因为对Jobject的引用不再存在。

人们将如何尝试解决该问题,以使循环正常工作,同时又删除jobj_state jobject?

0 个答案:

没有答案