Android RTC 自下而上分析(2)

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从下至上分析的快感?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/a281ec06e1fecc4957c204321396e201.html