2017-07-18 10 views
0

私はAndroidでopenSmile 2.0-rc1ライブラリを使用していますが、私は非常に厄介な問題に直面しています。初めてrunAnalysisを実行したときに問題なく通過します。私は有効な結果を得る。私は同じパラメータ私のアプリがクラッシュで二回同じ機能を実行したときにしかし、私はこのエラーを取得する:AndroidでOpenSmileライブラリが解析されない

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ライブラリではありませんでした。 最初の試行で正常に実行され、2回目の試行で失敗します。

アクティビティの再起動後、ネイティブメソッドの呼び出しが失敗することがあります。

これは、共有ライブラリが再ロードされないために発生します。手動でライブラリをアンロードまたはリロードするには、System.loadLibrary(String libName)に対称的な方法はありません。 Android上の共有ライブラリは、それを使用するプロセスがない場合にアンロードされます。アクティビティのライフサイクルが終了し、そのメソッドが呼び出されても、アクティビティのホストプロセスがまだ実行されている可能性があります。 Android docsから、アクティビティが終了した後、「いつでも、アクティビティをホストしているプロセスがシステムによって殺されるかもしれません。私は、OSが他のタスクのためにより多くのメモリを必要とするとき、それが殺されると思う。

したがって、古いプロセスが依然として固執している場合は、共有ライブラリも同様です。アクティビティが再び開始した後、onCreate()などと呼ばれると、同じ実行中のプロセスに接続し、同じ共有ライブラリインスタンスを処理します。すべての静的およびグローバル変数が格納されている共有ライブラリのデータセクションは、それが古い値を保持していた状態のままです。

ここで、考えられる問題を強調するには、ネイティブ側にシングルトンクラスがあるとします。アクティビティのonCreateメソッドからネイティブ関数を作成するためのネイティブ関数を呼び出します。ネイティブメソッドは次のようになります。

CSomeSingleton* CSomeSingleton::GetInstance() 
{ 
    if (m_Instance == NULL) 
     m_Instance = new CSomeSingleton(); 
    return m_Instance; 
} 

アクティビティのonDestroyでは、それを破棄する別のネイティブメソッドを呼び出します。それがこのように見えるとします。

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

アクシビティを再起動して同じプロセスに接続すると、問題が発生します。 m_InstanceはNULLではなく、メモリ内の無効なアドレスを指します。

この問題を解決する方法は3つあります。

  1. は(活動のonDestroy()に)すべてであなたのネイティブ側オブジェクトをdeinitializeしないでください。新しいアクティビティー・インスタンスが開始されると、有効なポインターおよびグローバル変数を使用して実行中のプロセスにアタッチされます。プロセスがその時間までに終了すると、共有ライブラリを再ロードしてデータセクションを再初期化し、再び開始されます。

  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

関連する問題