Android — вызов кода SoundTouch в моем коде C, программа потерпела крах

Я хочу вызвать метод C ++ в чистом коде c и следую статье. Мост ниже:

extern "C" {
void setSampleRateForC(SoundTouch *p, uint rate) {p->setSampleRate(rate);}
void setChannelsForC(SoundTouch *p, uint channels){ p->setChannels(channels);}
void setTempoChangeForC(SoundTouch *p, float tempo ){ p->setTempoChange(tempo);}
void setRateChangeForC(SoundTouch *p, float rate ){ p->setRateChange(rate);}
void setPitchSemiTonesForC(SoundTouch *p, float pitch) {p->setPitchSemiTones(pitch);}
BOOL setSettingForC(SoundTouch *p, int settingId, int value) { return p->setSetting(settingId, value);}

void setRateForC(SoundTouch *p, uint rate) {p->setRate(rate);}
void setTempoForC(SoundTouch *p, float tempo ){ p->setTempo(tempo);}
void setPitchForC(SoundTouch *p, float pitch) {p->setPitch(pitch);}

void putSamplesForC(SoundTouch *p,
const SAMPLETYPE *samples,  ///< Pointer to sample buffer.
uint numSamples                         ///< Number of samples in buffer. Notice
///< that in case of stereo-sound a single sample
///< contains data for both channels.
){ p->putSamples(samples, numSamples);}

uint receiveSamplesForC(SoundTouch *p, SAMPLETYPE *output, ///< Buffer where to copy output samples.
uint maxSamples                 ///< How many samples to receive at max.
) {
return p->receiveSamples(output, maxSamples);
}

SoundTouch *getInstance(){
return getInstance();
}

но когда я вызываю getIntance () в моем коде c, и программа падает. поэтому я хочу знать, что не так с кодом.

 LOGE("%s init SoundTouch begin", THIS_FILE);
pSoundTouch = soundtouch::getInstance();
LOGE("%s", THIS_FILE);

Но только поиск init SoundTouch начинается в logcat, а следующий журнал не появляется в logcat. Помогите мне, пожалуйста. благодарю вас.
и getInstance () это:

SoundTouch *SoundTouch::getInstance(){
return new SoundTouch();
}

1

Решение

Хорошо, я решил это, написав обертку:

// uses C calling convention
#include "SoundTouch.h"
#ifdef __cplusplus
extern "C" {
#endif

void* SoundTouch_Create(){
return new SoundTouch();
}

void SoundTouch_Destroy( void* thisC )
{
delete static_cast<SoundTouch*>(thisC);
}

void setSampleRateForC(void* thisC , uint rate) {static_cast<SoundTouch*>(thisC)->setSampleRate(rate);}
void setChannelsForC(void* thisC, uint channels){ static_cast<SoundTouch*>(thisC)->setChannels(channels);}
void setTempoChangeForC(void* thisC, float tempo ){ static_cast<SoundTouch*>(thisC)->setTempoChange(tempo);}
void setRateChangeForC(void* thisC, float rate ){ static_cast<SoundTouch*>(thisC)->setRateChange(rate);}
void setPitchSemiTonesForC(void* thisC, float pitch) {static_cast<SoundTouch*>(thisC)->setPitchSemiTones(pitch);}
BOOL setSettingForC(void* thisC, int settingId, int value) { return static_cast<SoundTouch*>(thisC)->setSetting(settingId, value);}

void setRateForC(void* thisC, uint rate) {static_cast<SoundTouch*>(thisC)->setRate(rate);}
void setTempoForC(void* thisC, float tempo ){ static_cast<SoundTouch*>(thisC)->setTempo(tempo);}
void setPitchForC(void* thisC, float pitch) {static_cast<SoundTouch*>(thisC)->setPitch(pitch);}

void putSamplesForC(void* thisC,
const SAMPLETYPE *samples,  ///< Pointer to sample buffer.
uint numSamples                         ///< Number of samples in buffer. Notice
///< that in case of stereo-sound a single sample
///< contains data for both channels.
){
static_cast<SoundTouch*>(thisC)->putSamples(samples, numSamples);
}

uint receiveSamplesForC(void* thisC, SAMPLETYPE *output, ///< Buffer where to copy output samples.
uint maxSamples                 ///< How many samples to receive at max.
)
{
return static_cast<SoundTouch*>(thisC)->receiveSamples(output, maxSamples);
}

#ifdef __cplusplus
}
#endif
0

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


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