Я пишу приложение для 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;
}
Пожалуйста, дайте мне знать, как преодолеть это.