OpenSmile 库无法分析 Android
OpenSmile library fails to analyze on Android
我在 Android 中使用 openSmile 2.0-rc1 库,我遇到了一个非常烦人的问题。当我 运行 runAnalysis
第一次通过时没有任何问题。我得到有效的结果。但是,当我使用相同的参数 运行 两次使用相同的函数时,我的应用程序崩溃了,并且出现此错误:
07-18 11:47:22.609 5128-5128/com.test A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 5128 (com.test)
07-18 11:47:22.711 196-196/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
07-18 11:47:22.711 196-196/? A/DEBUG: Build fingerprint: 'google/hammerhead/hammerhead:6.0.1/user/release-keys'
07-18 11:47:22.711 196-196/? A/DEBUG: Revision: '11'
07-18 11:47:22.711 196-196/? A/DEBUG: ABI: 'arm'
07-18 11:47:22.711 196-196/? A/DEBUG: pid: 5128, tid: 5128, name: com.test >>> com.test <<<
07-18 11:47:22.711 196-196/? A/DEBUG: signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
07-18 11:47:22.723 196-196/? A/DEBUG: r0 00000000 r1 00001408 r2 00000006 r3 b6f7eb7c
07-18 11:47:22.723 196-196/? A/DEBUG: r4 b6f7eb84 r5 b6f7eb34 r6 0000000b r7 0000010c
07-18 11:47:22.723 196-196/? A/DEBUG: r8 9eb91e40 r9 9c97a9c0 sl aa125d80 fp 00000001
07-18 11:47:22.723 196-196/? A/DEBUG: ip 00000006 sp bedf5848 lr b6cedb61 pc b6ceff50 cpsr 400f0010
07-18 11:47:22.737 196-196/? A/DEBUG: backtrace:
07-18 11:47:22.737 196-196/? A/DEBUG: #00 pc 00041f50 /system/lib/libc.so (tgkill+12)
07-18 11:47:22.737 196-196/? A/DEBUG: #01 pc 0003fb5d /system/lib/libc.so (pthread_kill+32)
07-18 11:47:22.737 196-196/? A/DEBUG: #02 pc 0001c30f /system/lib/libc.so (raise+10)
07-18 11:47:22.737 196-196/? A/DEBUG: #03 pc 000194c1 /system/lib/libc.so (__libc_android_abort+34)
07-18 11:47:22.737 196-196/? A/DEBUG: #04 pc 000174ac /system/lib/libc.so (abort+4)
07-18 11:47:22.737 196-196/? A/DEBUG: #05 pc 000c12e7 /data/app/com.test-1/lib/arm/libopenSmile.so (_ZN9__gnu_cxx27__verbose_terminate_handlerEv+226)
07-18 11:47:22.737 196-196/? A/DEBUG: #06 pc 00091e05 /data/app/com.test-1/lib/arm/libopenSmile.so (_ZN10__cxxabiv111__terminateEPFvvE+4)
07-18 11:47:22.737 196-196/? A/DEBUG: #07 pc 00091e79 /data/app/com.test-1/lib/arm/libopenSmile.so (_ZSt9terminatev+8)
07-18 11:47:22.737 196-196/? A/DEBUG: #08 pc 00091f9d /data/app/com.test-1/lib/arm/libopenSmile.so (__cxa_throw+120)
07-18 11:47:22.737 196-196/? A/DEBUG: #09 pc 00033a73 /data/app/com.test-1/lib/arm/libopenSmile.so (_ZNK10ConfigType10findFieldHEPKcPiPPKS_S2_PPc+346)
07-18 11:47:22.737 196-196/? A/DEBUG: #10 pc 00034d5f /data/app/com.test-1/lib/arm/libopenSmile.so (_ZN17cFileConfigReader11getInstanceEPKcPK10ConfigTypeP14cConfigManager+854)
07-18 11:47:22.737 196-196/? A/DEBUG: #11 pc 00036a73 /data/app/com.test-1/lib/arm/libopenSmile.so (_ZN14cConfigManager10readConfigEv+102)
07-18 11:47:22.737 196-196/? A/DEBUG: #12 pc 00090df3 /data/app/com.test-1/lib/arm/libopenSmile.so (runAnalysis+194)
07-18 11:47:22.738 196-196/? A/DEBUG: #13 pc 00fe573f /data/app/com.test-1/oat/arm/base.odex (offset 0xb75000) (void com.test.probing.probe.voiceAnalysis.OpenSmile.runAnalysis(java.lang.String, java.lang.String, java.lang.String, java.lang.String)+170)
07-18 11:47:22.738 196-196/? A/DEBUG: #14 pc 00fe532d /data/app/com.test-1/oat/arm/base.odex (offset 0xb75000) (java.lang.String com.test.probing.probe.voiceAnalysis.OpenSmile.runAnalysis(android.content.Context, java.lang.String)+872)
07-18 11:47:22.738 196-196/? A/DEBUG: #15 pc 0187d1c9 /data/app/com.test-1/oat/arm/base.odex (offset 0xb75000) (int com.test.probing.probe.voiceAnalysis.VoiceAnalyserService.onStartCommand(android.content.Intent, int, int)+292)
07-18 11:47:22.738 196-196/? A/DEBUG: #16 pc 72a4f10f /data/dalvik-cache/arm/system@framework@boot.oat (offset 0x1ed6000)
--------- beginning of system
07-18 11:47:23.199 778-6481/? W/ActivityManager: Force finishing activity com.test/.app.MainActivity
07-18 11:47:23.203 196-196/? A/DEBUG: Tombstone written to: /data/tombstones/tombstone_00
07-18 11:47:23.203 196-196/? E/DEBUG: AM write failed: Broken pipe
我将开放式微笑用作 JNI,并且我有一个服务 运行ning 分析。
我尝试了不同的 Android 版本,不同的架构,但我遇到了同样的问题。
我不明白第一次 运行 怎么会这样。
对于这方面的任何帮助,我将不胜感激。
先感谢您。
问题本身与 openSmile
库无关。
因为第一次尝试 运行s 成功,第二次 运行.
失败
activity 重新启动后,对本机方法的调用可能会失败。
这可能是因为没有重新加载共享库。 System.loadLibrary(String libName)
没有对称方法来手动卸载或重新加载库。当没有进程使用它时,Android 上的共享库将被卸载。即使 activity 完成其生命周期并且其 onDestroy()
方法被调用,activity 的宿主进程仍可能 运行。在 activity 完成后,来自 Android 文档 "the process hosting the activity may killed by the system at any time"。我认为当 OS 需要更多内存用于其他任务时它会被杀死。
因此,如果旧进程仍然存在,那么共享库也会存在。 activity 再次启动后,其 onCreate()
调用 etc,它附加到相同的 运行ning 进程并处理相同的共享库实例。存储所有静态和全局变量的共享库的数据部分仍然处于它承载旧值的状态。
现在,为了突出可能的问题,假设我们在本机端有一个 Singleton class。我们调用本机函数以从 activity 的 onCreate
方法创建它。本机方法可能如下所示。
CSomeSingleton* CSomeSingleton::GetInstance()
{
if (m_Instance == NULL)
m_Instance = new CSomeSingleton();
return m_Instance;
}
在 activity 的 onDestroy 中,我们调用了另一个销毁它的本机方法。假设它看起来像这样。
void CSomeSingleton::FreeInstance()
{
delete m_Instance;
}
活动重新启动并附加到同一进程后出现问题。 m_Instance 不会为 NULL,它会指向内存中的无效地址。
有 3 个变体可以解决这个问题。
根本不要取消初始化您的本机端对象(在 activity 的 onDestroy()
中)。当新的 activity 实例启动时,它将附加到具有有效指针和全局变量的 运行ning 进程。如果到时候该进程会被杀死,它会再次启动,重新加载共享库,重新初始化数据部分。
找到所有 global/static 变量处于不一致状态的地方。对于上面的例子,那将是
无效CSomeSingleton::FreeInstance()
{
删除 m_Instance;
m_Instance = 空;
}
在onDestory()
中调用System.exit(0)
停止进程,从而卸载共享库。被认为是一种不好的做法,因为您可能还有另一个组件 运行ning 在该进程中,并且该组件可能未处于停止其执行的适当状态(因为它可能有一些未保存的数据)。
感谢:http://choruscode.blogspot.dk/2013/12/on-android-ndk-and-activity-lifecycle.html
我在 Android 中使用 openSmile 2.0-rc1 库,我遇到了一个非常烦人的问题。当我 运行 runAnalysis
第一次通过时没有任何问题。我得到有效的结果。但是,当我使用相同的参数 运行 两次使用相同的函数时,我的应用程序崩溃了,并且出现此错误:
07-18 11:47:22.609 5128-5128/com.test A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 5128 (com.test)
07-18 11:47:22.711 196-196/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
07-18 11:47:22.711 196-196/? A/DEBUG: Build fingerprint: 'google/hammerhead/hammerhead:6.0.1/user/release-keys'
07-18 11:47:22.711 196-196/? A/DEBUG: Revision: '11'
07-18 11:47:22.711 196-196/? A/DEBUG: ABI: 'arm'
07-18 11:47:22.711 196-196/? A/DEBUG: pid: 5128, tid: 5128, name: com.test >>> com.test <<<
07-18 11:47:22.711 196-196/? A/DEBUG: signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
07-18 11:47:22.723 196-196/? A/DEBUG: r0 00000000 r1 00001408 r2 00000006 r3 b6f7eb7c
07-18 11:47:22.723 196-196/? A/DEBUG: r4 b6f7eb84 r5 b6f7eb34 r6 0000000b r7 0000010c
07-18 11:47:22.723 196-196/? A/DEBUG: r8 9eb91e40 r9 9c97a9c0 sl aa125d80 fp 00000001
07-18 11:47:22.723 196-196/? A/DEBUG: ip 00000006 sp bedf5848 lr b6cedb61 pc b6ceff50 cpsr 400f0010
07-18 11:47:22.737 196-196/? A/DEBUG: backtrace:
07-18 11:47:22.737 196-196/? A/DEBUG: #00 pc 00041f50 /system/lib/libc.so (tgkill+12)
07-18 11:47:22.737 196-196/? A/DEBUG: #01 pc 0003fb5d /system/lib/libc.so (pthread_kill+32)
07-18 11:47:22.737 196-196/? A/DEBUG: #02 pc 0001c30f /system/lib/libc.so (raise+10)
07-18 11:47:22.737 196-196/? A/DEBUG: #03 pc 000194c1 /system/lib/libc.so (__libc_android_abort+34)
07-18 11:47:22.737 196-196/? A/DEBUG: #04 pc 000174ac /system/lib/libc.so (abort+4)
07-18 11:47:22.737 196-196/? A/DEBUG: #05 pc 000c12e7 /data/app/com.test-1/lib/arm/libopenSmile.so (_ZN9__gnu_cxx27__verbose_terminate_handlerEv+226)
07-18 11:47:22.737 196-196/? A/DEBUG: #06 pc 00091e05 /data/app/com.test-1/lib/arm/libopenSmile.so (_ZN10__cxxabiv111__terminateEPFvvE+4)
07-18 11:47:22.737 196-196/? A/DEBUG: #07 pc 00091e79 /data/app/com.test-1/lib/arm/libopenSmile.so (_ZSt9terminatev+8)
07-18 11:47:22.737 196-196/? A/DEBUG: #08 pc 00091f9d /data/app/com.test-1/lib/arm/libopenSmile.so (__cxa_throw+120)
07-18 11:47:22.737 196-196/? A/DEBUG: #09 pc 00033a73 /data/app/com.test-1/lib/arm/libopenSmile.so (_ZNK10ConfigType10findFieldHEPKcPiPPKS_S2_PPc+346)
07-18 11:47:22.737 196-196/? A/DEBUG: #10 pc 00034d5f /data/app/com.test-1/lib/arm/libopenSmile.so (_ZN17cFileConfigReader11getInstanceEPKcPK10ConfigTypeP14cConfigManager+854)
07-18 11:47:22.737 196-196/? A/DEBUG: #11 pc 00036a73 /data/app/com.test-1/lib/arm/libopenSmile.so (_ZN14cConfigManager10readConfigEv+102)
07-18 11:47:22.737 196-196/? A/DEBUG: #12 pc 00090df3 /data/app/com.test-1/lib/arm/libopenSmile.so (runAnalysis+194)
07-18 11:47:22.738 196-196/? A/DEBUG: #13 pc 00fe573f /data/app/com.test-1/oat/arm/base.odex (offset 0xb75000) (void com.test.probing.probe.voiceAnalysis.OpenSmile.runAnalysis(java.lang.String, java.lang.String, java.lang.String, java.lang.String)+170)
07-18 11:47:22.738 196-196/? A/DEBUG: #14 pc 00fe532d /data/app/com.test-1/oat/arm/base.odex (offset 0xb75000) (java.lang.String com.test.probing.probe.voiceAnalysis.OpenSmile.runAnalysis(android.content.Context, java.lang.String)+872)
07-18 11:47:22.738 196-196/? A/DEBUG: #15 pc 0187d1c9 /data/app/com.test-1/oat/arm/base.odex (offset 0xb75000) (int com.test.probing.probe.voiceAnalysis.VoiceAnalyserService.onStartCommand(android.content.Intent, int, int)+292)
07-18 11:47:22.738 196-196/? A/DEBUG: #16 pc 72a4f10f /data/dalvik-cache/arm/system@framework@boot.oat (offset 0x1ed6000)
--------- beginning of system
07-18 11:47:23.199 778-6481/? W/ActivityManager: Force finishing activity com.test/.app.MainActivity
07-18 11:47:23.203 196-196/? A/DEBUG: Tombstone written to: /data/tombstones/tombstone_00
07-18 11:47:23.203 196-196/? E/DEBUG: AM write failed: Broken pipe
我将开放式微笑用作 JNI,并且我有一个服务 运行ning 分析。 我尝试了不同的 Android 版本,不同的架构,但我遇到了同样的问题。
我不明白第一次 运行 怎么会这样。
对于这方面的任何帮助,我将不胜感激。 先感谢您。
问题本身与 openSmile
库无关。
因为第一次尝试 运行s 成功,第二次 运行.
activity 重新启动后,对本机方法的调用可能会失败。
这可能是因为没有重新加载共享库。 System.loadLibrary(String libName)
没有对称方法来手动卸载或重新加载库。当没有进程使用它时,Android 上的共享库将被卸载。即使 activity 完成其生命周期并且其 onDestroy()
方法被调用,activity 的宿主进程仍可能 运行。在 activity 完成后,来自 Android 文档 "the process hosting the activity may killed by the system at any time"。我认为当 OS 需要更多内存用于其他任务时它会被杀死。
因此,如果旧进程仍然存在,那么共享库也会存在。 activity 再次启动后,其 onCreate()
调用 etc,它附加到相同的 运行ning 进程并处理相同的共享库实例。存储所有静态和全局变量的共享库的数据部分仍然处于它承载旧值的状态。
现在,为了突出可能的问题,假设我们在本机端有一个 Singleton class。我们调用本机函数以从 activity 的 onCreate
方法创建它。本机方法可能如下所示。
CSomeSingleton* CSomeSingleton::GetInstance()
{
if (m_Instance == NULL)
m_Instance = new CSomeSingleton();
return m_Instance;
}
在 activity 的 onDestroy 中,我们调用了另一个销毁它的本机方法。假设它看起来像这样。
void CSomeSingleton::FreeInstance()
{
delete m_Instance;
}
活动重新启动并附加到同一进程后出现问题。 m_Instance 不会为 NULL,它会指向内存中的无效地址。
有 3 个变体可以解决这个问题。
根本不要取消初始化您的本机端对象(在 activity 的
onDestroy()
中)。当新的 activity 实例启动时,它将附加到具有有效指针和全局变量的 运行ning 进程。如果到时候该进程会被杀死,它会再次启动,重新加载共享库,重新初始化数据部分。找到所有 global/static 变量处于不一致状态的地方。对于上面的例子,那将是
无效CSomeSingleton::FreeInstance() { 删除 m_Instance; m_Instance = 空; }
在
onDestory()
中调用System.exit(0)
停止进程,从而卸载共享库。被认为是一种不好的做法,因为您可能还有另一个组件 运行ning 在该进程中,并且该组件可能未处于停止其执行的适当状态(因为它可能有一些未保存的数据)。
感谢:http://choruscode.blogspot.dk/2013/12/on-android-ndk-and-activity-lifecycle.html