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 个变体可以解决这个问题。

  1. 根本不要取消初始化您的本机端对象(在 activity 的 onDestroy() 中)。当新的 activity 实例启动时,它将附加到具有有效指针和全局变量的 运行ning 进程。如果到时候该进程会被杀死,它会再次启动,重新加载共享库,重新初始化数据部分。

  2. 找到所有 global/static 变量处于不一致状态的地方。对于上面的例子,那将是

    无效CSomeSingleton::FreeInstance() { 删除 m_Instance; m_Instance = 空; }

  3. onDestory()中调用System.exit(0)停止进程,从而卸载共享库。被认为是一种不好的做法,因为您可能还有另一个组件 运行ning 在该进程中,并且该组件可能未处于停止其执行的适当状态(因为它可能有一些未保存的数据)。


感谢:http://choruscode.blogspot.dk/2013/12/on-android-ndk-and-activity-lifecycle.html