android NDK提供了对linux epoll 的封装API,头文件在android/looper.h ,
其封装的实现代码在(android4.3):
android-4.3/frameworks/base/native/android/looper.cpp 和
android-4.3/frameworks/native/libs/utils/Looper.cpp
android/looper.h 中有几个比较重要的函数:
typedef int (*ALooper_callbackFunc)(int fd, int events, void* data);
回调函数类型,返回1表示继续监听fd,返回0表示将fd删除,不再监听
int ALooper_addFd(ALooper* looper, int fd, int ident, int events, ALooper_callbackFunc callback, void* data);
添加fd到looper以便可以进行监听,具体参数含义可以查看头文件
int ALooper_pollOnce(int timeoutMillis, int* outFd, int* outEvents, void** outData);
开始监听addFd加进来的fd事件,用法请查看头文件
用法案例 :
int onEvent(int fd, int events, void* da)
{
Server *sv=(Server*)da;
return sv->handleEvent(fd, events, da); //分发处理事件
}
void Server::runLoop()
{
setnonblock(socket_fd); //设置为非阻塞
setnonblock(broadcast_fd);
looper=ALooper_prepare(0);
ALooper_acquire(looper);
ALooper_addFd(looper,socket_fd,0,events,(ALooper_callbackFunc)&onEvent,this);
ALooper_addFd(looper,broadcast_fd,0,events,(ALooper_callbackFunc)&onEvent,this);
............
............
pollTimeout=-1; //-1永不超时
exit_flag=0;
running=1;
while(true){
int result=ALooper_pollOnce(pollTimeout,NULL,NULL,NULL);
if(result== ALOOPER_POLL_ERROR){ //发生错误
break;
}
if(result==ALOOPER_POLL_TIMEOUT) //等待超时
{
doSomething();
}
if(exit_flag)break;
}
ALooper_removeFd(looper,broadcast_fd);
ALooper_removeFd(looper,socket_fd);
ALooper_release(looper); running=0;
}
相对于libevent,libuv库,NDK提供的API功能显然弱不少,且只能为用epoll。但是它方便,易用,
不需要额外的库,在不是太复杂的系统中可以尝试使用。