我正在编写一个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;
}
请让我知道如何克服这个问题。