2017-07-18 51 views
0

我在Android中使用openSmile 2.0-rc1庫,我正面臨一個非常煩人的問題。當我第一次運行runAnalysis時沒有任何問題。我得到有效的結果。然而,當我使用相同的參數運行相同功能的兩倍我的應用程序崩潰,我得到這個錯誤:OpenSmile庫無法在Android上進行分析

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/[email protected]@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和我有運行分析服務。 我嘗試過不同的Android版本,在不同的體系結構上,但我面臨同樣的問題。

我不明白這是如何發生的,當它第一次運行完美。

我很感激這方面的幫助。 預先感謝您。

回答

0

問題本身並不是openSmile庫。 由於它在第一次嘗試中成功運行並在第二次運行時失敗。

活動重新啓動後,對本地方法的調用可能會失敗。

發生這種情況可能是因爲共享庫沒有重新加載。 System.loadLibrary(String libName)沒有對稱方法來手動卸載或重新加載庫。當沒有使用它的進程時,Android上的共享庫將被卸載。即使活動完成其生命週期並調用其方法,活動的主機過程仍可能運行。活動結束後,從Android文檔「託管活動的進程可能隨時被系統殺死」。我認爲這會在操作系統需要更多的內存用於其他任務時被殺死。

因此,如果舊的過程仍然存在,共享庫也會如此。活動再次開始後,其onCreate()調用etc,它將附加到相同的運行進程並處理相同的共享庫實例。存儲所有靜態變量和全局變量的共享庫數據部分仍然處於舊值的狀態。

現在,爲了突出可能的問題,假設我們在本機端有一個Singleton類。我們調用本地函數從活動的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. 不要初始化您的本機端對象(在活動的onDestroy())。當新的活動實例啓動時,它將附加到運行有效指針和全局變量的進程。如果進程將被殺死,它會再次啓動,重新加載共享庫,重新初始化數據部分。

  2. 查找全局/靜態變量所處的狀態不一致的地方。對於上述示例,將會是

    void CSomeSingleton :: FreeInstance() { delete m_Instance; m_Instance = NULL; }

  3. 呼叫System.exit(0)onDestory()停止進程並因此卸載共享庫。被認爲是一種不好的做法,因爲您可能還有另一個組件在該進程中運行,並且此組件可能沒有處於停止執行的適當狀態(因爲它可能有一些未保存的數據)。


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