static jint Android_server_AlarmManagerService_init(JNIEnv* env, jobject obj)
{
return open("/dev/alarm", O_RDWR);
}
static void android_server_AlarmManagerService_set(JNIEnv* env, jobject obj, jint fd, jint type, jlong nanoseconds)
{
struct timespec ts;
ts.tv_sec = NANOSECONDS_TO_SECONDS(nanoseconds);
ts.tv_nsec = nanoseconds - SECONDS_TO_NANOSECONDS(ts.tv_sec);
int result = ioctl(fd, ANDROID_ALARM_SET(type), &ts);
}
static JNINativeMethod sMethods[] = {
/* name, signature, funcPtr */
{"init", "()I", (void*)android_server_AlarmManagerService_init},
{"close", "(I)V", (void*)android_server_AlarmManagerService_close},
{"set", "(IIJ)V", (void*)android_server_AlarmManagerService_set},
};
颜色部分说明了一个问题,那就是android也就那么回事,JNI就是按照特定写法的JAVA版的linux c应用程序。完事。如果你觉得不是这么回事,那么你就有事了,去复习复习linux文件IO,看看如何用一个文件描述符打开设备,操作设备等等。
4、 framework层
frameworks/base/services/java/com/android/server/AlarmManagerService.java
frameworks/base/core/java/android/app/AlarmManager.java
下面的是直接提供给app层的API接口,它是AlarmManagerService.java的一个封装。
这里只是简单的解释下service到底在此做什么了。
其实也没做什么,仅仅是把上面分析的JNI拿来在此调用一下而已。然后包装一下,将功能实现得更完美些。
下面是 AlarmManagerService这个类中摘出来的小段:
private native int init();
private native void close(int fd);
private native void set(int fd, int type, long nanoseconds);
private native int waitForAlarm(int fd);
private native int setKernelTimezone(int fd, int minuteswest);
这些就是JNI实现过来的接口。呵呵。
5、APP层
packages/apps/AlarmClock/src/com/android/alarmclock/ 这个目录下,就是系统自带定时器的源代码,比如Alarms.java 中:第一个导入的包就是
import android.app.AlarmManager; 怎样,到现在是否感受到了android从下至上分析的快感?