0

私のアプリは99%Cで書かれており、NDKでは利用できないもののためのJavaヘルパー関数がいくつかあります。ファイルチューザーとして、Java側から次のように開始しているListActivityを使用しています。

Intent myIntent = new Intent(this, FileChooser.class);
startActivity(myIntent);

このListActivityの実行中、NDKスレッドは、ユーザーがファイルを選択し、を使用してListActivityを閉じるのを待ちます。

ALooper_pollAll();

イベントがNDKスレッドをウェイクアップするたびに、JNIを使​​用してJava側を呼び出し、ListActivityがまだ開いているかユーザーによって閉じられているかを示すフラグをチェックします。ListActivityのonDestroy()メソッドには、次のコードがあります。

@Override
protected void onDestroy() {    
    super.onDestroy();          
    if(isFinishing()) listActivityDone = true;      
}

私の問題は、ユーザーがListActivityの[戻る]ボタンを押すと、NDKスレッドが正しくウェイクアップされることですが、残念ながら、NDKスレッドがウェイクアップされた後にonDestroy()が呼び出されるため、NDKスレッドが正しい値を取得しません。フラグ「listActivityDone」の。NDKスレッドがウェイクアップされても、NDKスレッドがウェイクアップされた直後にonDestroy()が呼び出されるため、「listActivityDone」はまだFALSEです。

したがって、この問題を解決するために必要なのは、フラグ「listActivityDone」をTRUEに設定した後、NDKスレッドをもう一度ウェイクアップすることです。誰かがこれをどのように達成できるか知っていますか?

もちろん、JavaからC関数を呼び出してからALooper_wake()を呼び出すこともできますが、Java側からNDKスレッドをウェイクアップするためのより良いバージョンがあることはほぼ間違いありません。何か案は?

ご協力いただきありがとうございます!

4

2 に答える 2

0

おそらく、フラグをonPause、onResumeに移動できます。

@Override
protected void onPause() {    
    super.onPause();          
    if(isFinishing()) listActivityDone = true;      
}

@Override
protected void onResume() {    
    super.onResume();          
    if(!isFinishing()) listActivityDone = false;      
}

そうすれば、以前に呼び出されます。onPauseが特定のシナリオに適用できない場合は、onStopに配置することも検討できます。

于 2013-01-21T15:24:42.567 に答える
0

APP_CMD_TERM_WINDOW正しくシャットダウンするコマンドを処理できますか?

于 2013-01-21T15:26:32.583 に答える