本文主要是介绍[Android源码解析]Eventloop在jni层的分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
3 eventloop在jni层的详细分析
Eventloop在整个bluetooth的jni层和bluez之间的交互,以及jni和framework层之间的交互过程中有着举足轻重的作用。所以,本文仍然需要花费一定的笔墨来分析它,当然由于它更像是一个桥梁,我们的分析有可能就不是那么的深入了,会从比较宏观地角度来看待这个东西的作用。
当然,一切的一切还是要从源码来说:
static jboolean startEventLoopNative(JNIEnv *env, jobject object) {jboolean result = JNI_FALSE;
#ifdef HAVE_BLUETOOTHevent_loop_native_data_t *nat = get_native_data(env, object);pthread_mutex_lock(&(nat->thread_mutex));//这个是用来判断eventloop是否启动的nat->running = false;if (nat->pollData) {LOGW("trying to start EventLoop a second time!");pthread_mutex_unlock( &(nat->thread_mutex) );return JNI_FALSE;}//申请pollfanat->pollData = (struct pollfd *)malloc(sizeof(struct pollfd) *DEFAULT_INITIAL_POLLFD_COUNT);if (!nat->pollData) {LOGE("out of memory error starting EventLoop!");goto done;}//申请dbus的watch datanat->watchData = (DBusWatch **)malloc(sizeof(DBusWatch *) *DEFAULT_INITIAL_POLLFD_COUNT);if (!nat->watchData) {LOGE("out of memory error starting EventLoop!");goto done;}//初始化为0memset(nat->pollData, 0, sizeof(struct pollfd) *DEFAULT_INITIAL_POLLFD_COUNT);memset(nat->watchData, 0, sizeof(DBusWatch *) *DEFAULT_INITIAL_POLLFD_COUNT);//datasize和member count的初始化nat->pollDataSize = DEFAULT_INITIAL_POLLFD_COUNT;nat->pollMemberCount = 1;//申请socket 对,保存到controlFdRif (socketpair(AF_LOCAL, SOCK_STREAM, 0, &(nat->controlFdR))) {LOGE("Error getting BT control socket");goto done;}//data 0是其中一个,可以猜到了是通过socket在内部通信的nat->pollData[0].fd = nat->controlFdR;nat->pollData[0].events = POLLIN;env->GetJavaVM( &(nat->vm) );nat->envVer = env->GetVersion();nat->me = env->NewGlobalRef(object);//建立eventloop,详细分析见3.1if (setUpEventLoop(nat) != JNI_TRUE) {LOGE("failure setting up Event Loop!");goto done;}//建立eventloopmain的thread,他肯定就是在不停地运行了&#
这篇关于[Android源码解析]Eventloop在jni层的分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!