Ошибка в отладчике Android C++/C, неверные значения аргументов

Недавно я столкнулся с действительно странной проблемой при отладке приложения C/C++ в Android Studio.

я использую Android Studio 3.0

Вот мой JNI Call

JNIEXPORT jshortArray JNICALL
Java_net_crosp_android_library_ecgaudioprocessor_EcgSignalProcessorDemodulator_demodulate(
        JNIEnv *env, jobject instance, jshortArray readBuffer_) {

    /* get size of the array */
    jsize len = env->GetArrayLength(readBuffer_);
    int sample_rate = 44100;
    int kd = 12;
    SignalConfiguration signal_cfg = {sample_rate, kd, 1700, sample_rate, sample_rate / kd, 200};
    ECGFMDemodulator *ecg_fm_demodulator = new ECGFMDemodulator();
    ecg_fm_demodulator->set_cfg(signal_cfg);
    ECGFMDemodulator *ecg_fm_demodulator2 = new ECGFMDemodulator(signal_cfg);

    /* get the body of array; it will be referecende by C pointer */
    jshort *body = env->GetShortArrayElements(readBuffer_, JNI_FALSE);

    env->ReleaseShortArrayElements(readBuffer_, body, JNI_COMMIT);
    return readBuffer_;
}

Учебный класс ECGFMDemodulator

class ECGFMDemodulator {
private:
    SignalConfiguration m_signal_configuration_;
public:

    ECGFMDemodulator(SignalConfiguration configuration);

    void set_cfg(SignalConfiguration param);
};

И реализация

ECGFMDemodulator::ECGFMDemodulator(SignalConfiguration configuration) {
    this->m_signal_configuration_ = configuration;
    std::cout.rdbuf(new Androidbuf);
    // Print values
    std::cout << "------ VALUES OF CONFIGURATION --------" << std::endl;
    std::cout << "Sample rate : " << this->m_signal_configuration_.sample_rate << std::endl;
    std::cout << "KD : " << this->m_signal_configuration_.kd << std::endl;
    std::cout << "FC : " << this->m_signal_configuration_.fc << std::endl;
    std::cout << "FS : " << this->m_signal_configuration_.fs << std::endl;
    std::cout << "FS2 : " << this->m_signal_configuration_.fs2 << std::endl;
    delete std::cout.rdbuf(0);
    this->init_filters();
}

void ECGFMDemodulator::set_cfg(SignalConfiguration param) {
    this->m_signal_configuration_ = param;
}

Я создаю такой объект

int sample_rate = 44100;
int kd = 12;
SignalConfiguration signal_cfg = {sample_rate, kd, 1700, sample_rate, sample_rate / kd, 200};
ECGFMDemodulator *ecg_fm_demodulator = new ECGFMDemodulator();
ecg_fm_demodulator->set_cfg(signal_cfg);
ECGFMDemodulator *ecg_fm_demodulator2 = new ECGFMDemodulator(signal_cfg);

И во время отладки я получил интересные результаты

  1. Создание signal_cfg, как вы можете видеть, значения действительны

  1. Наблюдая за значениями в конструкторе, вы можете видеть случайные значения

  1. После создания этого объекта значения корректны и выводятся на консоль с допустимыми значениями. Однако в отладчике они по-прежнему мусор.
I/std: ------ VALUES OF CONFIGURATION --------
I/std: Sample rate : 44100
I/std: KD : 12
I/std: FC : 1700
I/std: FS : 44100
I/std: FS2 : 3675

Я также пытался использовать lldb но получили те же значения, которые не действительны. Я также пытался передать по ссылке, но получил тот же результат.

(lldb) frame variable
(ECGFMDemodulator *) this = 0xb7688d29
(SignalConfiguration) param = (sample_rate = -1217884423, kd = -1204349992, fc = -1217887850, fs = -1982518100, fs2 = -1983635321, delay = 36)

Что не так с отладчиком, я не могу отладить свою программу, потому что я не уверен, что отображаемые значения действительны.

Кто-нибудь испытывает подобные проблемы?

Буду благодарен за любую помощь.

Спасибо

0 ответов

Другие вопросы по тегам