在项目中使用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错误,但是它内部的判断较多,估计会慢一些。

更多相关文章

  1. Android系列教程(三)
  2. Android(安卓)应用程序组件学习
  3. Android驱动程序开发和调试环境配置
  4. Android系统工具之Monkey自动化测试
  5. Android应用程序生命同期
  6. Android(安卓)日历提供器(三)
  7. Android小程序-Walker注册页面(四)
  8. Android的安全体系
  9. Android(安卓)分析内存的使用情况

随机推荐

  1. 【Android-Activity】EditText的基本属性
  2. Android各个版本对应的源代码
  3. Android(安卓)Widget开发系列(二)
  4. android N 编译环境搭建
  5. 鸿蒙开发TV软件环境搭建以及简单教程
  6. android程序执行adb shell命令
  7. 详解Android(安卓)App AllowBackup配置带
  8. android使用util工具包
  9. android opensource webs
  10. android 短信拦截