Android下Speex库除0错误(SIGFPE)排除
16lz
2021-01-24
在项目中使用Speex对实时采集到的音频流进行去噪,发现运行一段时间后程序就会崩溃。
首先需要得到程序崩溃时的调用堆栈,在终端输入命令:
adb logcat | ndk-stack -sym ./xxxGame/proj.android/obj/local/armeabi
然后再让程序跑起来等着,出错后得到如下信息:
********** Crash dump: **********Build fingerprint: 'Lenovo/smarttp/S898tp:4.4.2/KOT49H/VIBEUI_V2.0_1447_7.5.1_ST_S898t+.:user/release-keys'pid: 12612, tid: 12700, name: Thread-8281 >>> org.cocos2dx.hellocpp <<
据此查看源码后确定是DIV32_16_Q15调用的DIV32_16引起的,故修改fixed_generic.h的最后几行:
//fixed by mazi#define DIV32_16(a,b) (0==(b) ? 0 : ((spx_word16_t)(((spx_word32_t)(a))/((spx_word16_t)(b)))))#define PDIV32_16(a,b) (0==(b) ? 0 : ((spx_word16_t)(((spx_word32_t)(a)+((spx_word16_t)(b)>>1))/((spx_word16_t)(b)))))#define DIV32(a,b) (0==(b) ? 0 : (((spx_word32_t)(a))/((spx_word32_t)(b))))#define PDIV32(a,b) (0==(b) ? 0 : (((spx_word32_t)(a)+((spx_word16_t)(b)>>1))/((spx_word32_t)(b))))
搞定收工!
注: 这里我用的编译选项是FIXED_POINT,因为如果用FLOATING_POINT很多Android手机跑不动。
另外还有个编译选项是FIXED_POINT_DEBUG,开启后也可以避免除0错误,但是它内部的判断较多,估计会慢一些。
更多相关文章
- Android系列教程(三)
- Android(安卓)应用程序组件学习
- Android驱动程序开发和调试环境配置
- Android系统工具之Monkey自动化测试
- Android应用程序生命同期
- Android(安卓)日历提供器(三)
- Android小程序-Walker注册页面(四)
- Android的安全体系
- Android(安卓)分析内存的使用情况