3

JNI からネイティブ dll のメソッドを呼び出しています。正常に動作しますが、ネイティブ コードのある場所で exit(1) を呼び出しているため、ネイティブ コードが動作しなくなりますが、Java アプリケーションも終了します。何か不足していますか?Javaアプリケーション全体ではなくネイティブコードのみを強制終了できるJNIのメソッドはありますか?

編集:基本的に、ネイティブ コードでファイルを暗号化しています。誰かがJavaから操作をキャンセルしたときに暗号化を停止したい.

どんな助けでもいただければ幸いです。

4

3 に答える 3

8

JNI ネイティブ コードと JVM は同じプロセスで実行されます。exitプロセスをシャットダウンするため、JVM も終了します。

ネイティブ コードで実行されるスレッドを強制終了すると、リソースがリークする可能性があるため、サポートされていません。詳しくはこちらをご覧ください。

于 2012-12-26T09:40:29.640 に答える
1

ネイティブ コードの別のスレッドにある場合は、停止してください。

//sample thread code
void thread(){
  while (1) {
    //do something
    if ( done ) return;
  }
}

ネイティブ関数を使用していて、Java に戻りたい場合は、そのまま戻ります。

関数呼び出しとループのもつれた迷路を作成した場合。すべて同様であり、外に出て、ネイティブ例外をスローし、最後のネイティブレベルでそれをキャッチして戻る必要があります。これはあまりお勧めできませんが、お勧めできませんが、この種の混乱に陥ることがあります。

// Do not write code like this
// A kitten and a puppy die every time you call it
void foo(){
  while (1){
     bar();
  }
}

void bar(){
  for( i=0; i < 100; i++){
    baz();
    quux();
  }
}

void baz(){
 // something
}

void quux(){
 // something
 if( want_to_exit) throw new GetOut();
}

void JNI_Method(.....){
   try {
     if (x) foo();
   } catch ( GetOut g){
      return;
   }
}
于 2012-12-26T09:44:55.313 に答える
0

私が行ったことは、別のスレッドで暗号化コードを実行し、必要に応じてメインスレッドから terminatethread() を使用して新しく作成されたスレッドを終了することですが、問題は terminatethread() が時間内にリソース (ファイルハンドルなど) を解放しないことです。スレッドが閉じられた直後に Java からファイルを削除できません。

于 2012-12-27T04:45:09.583 に答える