退出方法/过程而不调用exit()方法

时间:2019-07-10 17:43:04

标签: java android c java-native-interface 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。

但是,当线程因为连续运行而停止时,该方法不存储库;仅当我使用“ 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;

}

请让我知道如何克服这个问题。

0 个答案:

没有答案