armv7-a デバイス用に gcc 4.6 で ffmpeg をコンパイルしています (これは ndk r9 のデフォルトであるため)。gcc 4.4.3 でコンパイルされたコードを実行すると発生しなかった特定のデバイスで奇妙なクラッシュが発生します。
これはバックトレースです:
08-02 18:36:08.200: I/sec_anm_ahi_output(1535): setParameters(stop_output_streamtype=1)
08-02 18:36:08.360: I/DEBUG(18804): #00 pc 000162a0 /system/lib/libc.so (__libc_android_abort)
08-02 18:36:08.360: I/DEBUG(18804): #01 pc 00418334 /data/data/com.ffmpeg.android/lib/libffmpeg.so (__check_for_sync8_kernelhelper)
08-02 18:36:08.360: I/DEBUG(18804): libc base address: afd00000
Googleで検索した後、問題は64ビットアトミックにあるようです.私のコンパイルされたコードはdmb命令を使用していないようで、代わりにkernelhelperを呼び出しています:
https://code.google.com/p/android/issues/detail?id=41297
http://www.ogre3d.org/forums/viewtopic.php?f=21&t=78199
回避策はarmv7-a用にコンパイルすることですが、すでに同じ結果でこれを行っています。これらは私が使用しているフラグです:
CPU=armv7-a
OPTIMIZE_CFLAGS="-march=$CPU -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp -mthumb -D__thumb__"
EXTRA_LDFLAGS="-Wl,--fix-cortex-a8 -march=armv7-a"
PREFIX=./android/$CPU
EXTRA_CONFIGURE=""
私もこれらを試しましたが、同じ結果になりました:
CPU=armv7-a
OPTIMIZE_CFLAGS="-march=$CPU -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp -mthumb -D__thumb__"
EXTRA_LDFLAGS="-Wl,--fix-cortex-a8 -march=armv7-a"
PREFIX=./android/$CPU
EXTRA_CONFIGURE="--disable-armv5te --disable-armv6 --disable-armv6t2"
さまざまなデバイスでテストしましたが、結果は次のとおりです。
Nexus 4 - クラッシュなし
Nexus 7 - クラッシュなし
Galaxy sII - クラッシュ
ギャラクシー エース 2 - クラッシュ
助けていただければ幸いです。
ありがとう。