首页 > 解决方案 > 退出方法/进程而不调用 exit() 方法

问题描述

我正在编写一个 android 应用程序,我通过 JNI 使用 C 代码作为库。我将库作为一个单独的线程启动,如下所示。

    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时,我通过中断它来停止线程。

但是,当线程在 coitnuuosly 运行时停止时,该方法不会库,并且仅在我使用“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;

}

请让我知道如何克服这一点。

标签: javaandroidcjava-native-interfaceexit

解决方案


推荐阅读