Ошибка в отладчике 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);
И во время отладки я получил интересные результаты
- Создание
signal_cfg
, как вы можете видеть, значения действительны
- Наблюдая за значениями в конструкторе, вы можете видеть случайные значения
- После создания этого объекта значения корректны и выводятся на консоль с допустимыми значениями. Однако в отладчике они по-прежнему мусор.
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)
Что не так с отладчиком, я не могу отладить свою программу, потому что я не уверен, что отображаемые значения действительны.
Кто-нибудь испытывает подобные проблемы?
Буду благодарен за любую помощь.
Спасибо