在 JNI .cpp 文件中,我有一个带有 SoundTouch* 的结构(SoundTouch 是一个 C++ 音频处理,我将其包装以在 Android 项目中使用),并且我将结构的向量初始化为全局对象,如下所示:
struct SoundTouchExt
{
SoundTouch* sTouch;
queue<signed char>* fBufferOut;
int channels;
int sampleRate;
float tempoChange;
int pitchSemi;
int bytesPerSample;
SoundTouchExt()
{
sTouch = new SoundTouch();
fBufferOut = new queue<signed char>();
}
};
const int MAX_TRACKS = 16;
vector<SoundTouchExt> sProcessors(MAX_TRACKS);
这是可行的,至少如果我在我的程序中一次只使用一个 SoundTouchExt 对象(这是一个不同的故事,但可能相关 - 播放多个实例会导致输出失真)。
但是,如果我这样声明它SoundTouch sTouch;
,注释掉new
并相应地更改它的使用(->
到.
),指向引用的指针,我编译得很好,但是一旦程序尝试使用该对象,我就会得到一个 FAULT 11(段错误) .
这是发生这种情况的地方:
...
SoundTouchExt& soundTouch = sProcessors.at(track);
setup(soundTouch, channels, samplingRate, bytesPerSample, tempo, pitchSemi);
}
static void setup(SoundTouchExt& soundTouch, int channels, int sampleRate, int bytesPerSample, float tempoChange, float pitchSemi)
{
SoundTouch& sTouch = soundTouch.sTouch;
soundTouch.channels = channels;
soundTouch.sampleRate = sampleRate;
soundTouch.bytesPerSample = bytesPerSample;
soundTouch.tempoChange = tempoChange;
soundTouch.pitchSemi = pitchSemi;
sTouch.setSampleRate(sampleRate);
sTouch.setChannels(channels);
...
}
通过一些研究,我认为这可能是静态初始化命令 fiasco的一个实例。我在库源代码中看不到任何全局变量,但我对 C++ 了解得不够多,不知道还要寻找什么。
我的观察对图书馆有什么建议(或者我可能没有正确地做某事)?