1

JNI .cpp ファイルには、SoundTouch* を含む構造体があり (SoundTouch は、Android プロジェクトで使用するためにラップしている C++ オーディオ処理です)、構造体のベクトルを次のようなグローバル オブジェクトとして初期化します。

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);

少なくとも、プログラムで一度に 1 つの SoundTouchExt オブジェクトのみを使用する場合、これは機能します (これは別の話ですが、関連している可能性があります。複数のインスタンスが再生されていると出力が歪んでしまいます)。

ただし、このように宣言しSoundTouch sTouch;、コメントアウトして、newそれに応じて使用方法を変更すると (参照->.のポインター)、コンパイルは問題なく実行されますが、プログラムがオブジェクトを使用しようとするとすぐに FAULT 11 (seg fault) が発生します。 .

それが起こる場所は次のとおりです。

...
    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);
...
}

少し調査したところ、これは静的初期化順序の失敗のインスタンスである可能性があると考えています。ライブラリのソース コードにグローバル変数が見当たりませんが、他に何を探すべきかを知るには C++ について十分に知りません。

私の観察は、ライブラリについて何を示唆していますか (または、私が何かを正しく行っていない可能性があります)?

4

1 に答える 1