2

私はAndroidプログラミングに不慣れです。NDK-BuildでビルドしているネイティブCアプリケーションがあります。スレッドの1つで静的割り当てを行っています。

int X [64] [4096]; //<-正確に1MBのスペースが必要です。

これをadbシェルを使用して実行すると、「セグメンテーション違反」が発生します。配列をX[63][4096]に減らすと、正常に実行されているようです。これで、AndroidのVMには16MBなどの制限があることがわかりましたが、このプログラムではRAMに2MBを割り当てることはほとんどありません([設定]-> [アプリ]には、さらに650 MBのスペアRAMが残っていることが示されています)。

このクラッシュの原因は何でしょうか?そしてそれを修正する方法は?

よろしく

4

2 に答える 2

5

実際に行っている割り当ては静的ではありません。が関数内のローカル変数である場合X、関数が入力されるたびにスタック(通常はヒープよりもはるかに小さい)に動的に割り当てられ、関数が戻ると解放されます。

本当にX静的であることが意図されている場合(つまりX、スレッド関数のすべてのインスタンスで共有されるコピーが1つある必要がある場合)、変数を宣言できますstatic
各スレッドに独自のXのコピーを持たせる場合は、を使用してヒープにスペースを明示的に割り当て、を使用malloc() / new []して解放する必要がありfree() / delete []ます。

于 2012-12-17T20:50:02.053 に答える
1

LinuxからAndroidにゲームを移植しようとしていますが、Androidの小さな1 MBスタックに非常に問題があり、これは完全に不十分であり、至る所でセグフォールトを引き起こしています。Linuxではデフォルトのスタックサイズは8MBであり、WindowsではスタックはVSで簡単に構成できました。Android NDKでスタックサイズを増やす方法はありますか?そのため、すべての固定配列を低速で醜いmalloc / freeに置き換える必要はありませんか?

于 2015-05-09T17:41:18.287 に答える