Выход из метода / процесса без вызова метода exit () - PullRequest
2 голосов
/ 10 июля 2019

Я пишу приложение для Android, где я использую код C в качестве библиотеки через JNI.Я запускаю библиотеку как отдельный поток, как показано ниже.

    public class LibraryHandler implements Runnable {
        private static final String TAG = "LibraryHandler";
        @Override
        public void run() {
                Log.w(TAG, "Starting library");
                testJNILib.startlibrary();
        Log.e(TAG, "Bounced out of library Handler loop. Exiting....");
      }
    }

, и я останавливаю поток, прерывая его, когда мое приложение закрывается, и присваиваю ему значение null.

Но метод не выполняет библиотеку, когда поток останавливается, так как он запускается последовательно, и останавливается, только когда я завершаю его вручную, используя вызов stoplibary ().Но когда я вызываю вызов stoplibrary, он вызывает функцию exit () и поэтому закрывает все приложение.Я хочу остановить только библиотеку, а не весь процесс.Я должен очистить все ресурсы, поэтому я не могу использовать return вместо exit ().Кто-нибудь, пожалуйста, дайте мне знать любой подход, который я могу использовать, чтобы очистить все ресурсы вместо выхода.

"startLibrary ()" & "stoplibrary ()" отправляется в JNI, как показано

    extern "C" JNIEXPORT jint JNICALL Java_com_test_android_client_testJNILib_startlibrary(JNIEnv * je, jclass jc)
{
   char *argv[] = {"libproxyd", "-o", "unix:/data/data/com.adaranet.android.droidproxyclient2/files/proxy_db.sock"};
   int ret = start(3, argv);
   return ret;
}
 extern "C" JNIEXPORT jint JNICALL Java_com_test_android_client_testJNILib_stoplibrary(JNIEnv * je, jclass jc){
   library_signal_handler(SIGTERM);
   LOGE("CAlled library_signal_handler");
   return 1;
}

Значение library_signal_handler () выглядит следующим образом:

    void
    library_signal_handler (int signo)
{
  int ret;
  __android_log_print (ANDROID_LOG_ERROR, "LIBRARY_MAIN", "Got signal %d \n", signo);
  switch (signo) {
 case SIGTERM:
    __android_log_print (ANDROID_LOG_INFO, "LIBRARY_MAIN", "signal received sigterm\n");
  delete_all_alias_interface(alias_count);
  exit_stage_left();
  exit (0);
  break;

}

Пожалуйста, дайте мне знать, как преодолеть это.

...