19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * System clock functions.
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
221f5762e646bed2290934280464832782766ee68eMathias Agopian#include <sys/time.h>
231f5762e646bed2290934280464832782766ee68eMathias Agopian#include <limits.h>
241f5762e646bed2290934280464832782766ee68eMathias Agopian#include <fcntl.h>
251f5762e646bed2290934280464832782766ee68eMathias Agopian#include <errno.h>
261f5762e646bed2290934280464832782766ee68eMathias Agopian#include <string.h>
271f5762e646bed2290934280464832782766ee68eMathias Agopian
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h"
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h"
30ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe#include "core_jni_helpers.h"
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/time.h>
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <time.h>
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
351f5762e646bed2290934280464832782766ee68eMathias Agopian#include <utils/SystemClock.h>
361f5762e646bed2290934280464832782766ee68eMathias Agopian
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * native public static long uptimeMillis();
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_os_SystemClock_uptimeMillis(JNIEnv* env,
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jobject clazz)
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jlong)uptimeMillis();
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * native public static long elapsedRealtime();
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_os_SystemClock_elapsedRealtime(JNIEnv* env,
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jobject clazz)
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jlong)elapsedRealtime();
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * native public static long currentThreadTimeMillis();
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_os_SystemClock_currentThreadTimeMillis(JNIEnv* env,
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jobject clazz)
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct timespec tm;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tm);
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return tm.tv_sec * 1000LL + tm.tv_nsec / 1000000;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
71648bee18a1ccd362445d562729250ff5910f16a0Romain Guy * native public static long currentThreadTimeMicro();
72648bee18a1ccd362445d562729250ff5910f16a0Romain Guy */
73648bee18a1ccd362445d562729250ff5910f16a0Romain Guystatic jlong android_os_SystemClock_currentThreadTimeMicro(JNIEnv* env,
74648bee18a1ccd362445d562729250ff5910f16a0Romain Guy        jobject clazz)
75648bee18a1ccd362445d562729250ff5910f16a0Romain Guy{
76648bee18a1ccd362445d562729250ff5910f16a0Romain Guy    struct timespec tm;
77648bee18a1ccd362445d562729250ff5910f16a0Romain Guy
78648bee18a1ccd362445d562729250ff5910f16a0Romain Guy    clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tm);
79648bee18a1ccd362445d562729250ff5910f16a0Romain Guy
80648bee18a1ccd362445d562729250ff5910f16a0Romain Guy    return tm.tv_sec * 1000000LL + tm.tv_nsec / 1000;
81648bee18a1ccd362445d562729250ff5910f16a0Romain Guy}
82648bee18a1ccd362445d562729250ff5910f16a0Romain Guy
83648bee18a1ccd362445d562729250ff5910f16a0Romain Guy/*
84648bee18a1ccd362445d562729250ff5910f16a0Romain Guy * native public static long currentTimeMicro();
85648bee18a1ccd362445d562729250ff5910f16a0Romain Guy */
86648bee18a1ccd362445d562729250ff5910f16a0Romain Guystatic jlong android_os_SystemClock_currentTimeMicro(JNIEnv* env,
87648bee18a1ccd362445d562729250ff5910f16a0Romain Guy        jobject clazz)
88648bee18a1ccd362445d562729250ff5910f16a0Romain Guy{
89648bee18a1ccd362445d562729250ff5910f16a0Romain Guy    struct timeval tv;
90648bee18a1ccd362445d562729250ff5910f16a0Romain Guy
91648bee18a1ccd362445d562729250ff5910f16a0Romain Guy    gettimeofday(&tv, NULL);
92648bee18a1ccd362445d562729250ff5910f16a0Romain Guy    return tv.tv_sec * 1000000LL + tv.tv_usec;
93648bee18a1ccd362445d562729250ff5910f16a0Romain Guy}
94648bee18a1ccd362445d562729250ff5910f16a0Romain Guy
95648bee18a1ccd362445d562729250ff5910f16a0Romain Guy/*
9695f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly * public static native long elapsedRealtimeNano();
9795f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly */
9895f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pellystatic jlong android_os_SystemClock_elapsedRealtimeNano(JNIEnv* env,
9995f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly        jobject clazz)
10095f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly{
10195f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly    return (jlong)elapsedRealtimeNano();
10295f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly}
10395f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly
10495f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly/*
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration.
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMethods[] = {
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* name, signature, funcPtr */
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "uptimeMillis",      "()J",
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (void*) android_os_SystemClock_uptimeMillis },
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "elapsedRealtime",      "()J",
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (void*) android_os_SystemClock_elapsedRealtime },
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "currentThreadTimeMillis",      "()J",
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (void*) android_os_SystemClock_currentThreadTimeMillis },
115648bee18a1ccd362445d562729250ff5910f16a0Romain Guy    { "currentThreadTimeMicro",       "()J",
116648bee18a1ccd362445d562729250ff5910f16a0Romain Guy            (void*) android_os_SystemClock_currentThreadTimeMicro },
117648bee18a1ccd362445d562729250ff5910f16a0Romain Guy    { "currentTimeMicro",             "()J",
118648bee18a1ccd362445d562729250ff5910f16a0Romain Guy            (void*) android_os_SystemClock_currentTimeMicro },
119dd78d462f6dceac71f9d1cbb723bb38a3b5bdc2eJeff Sharkey    { "elapsedRealtimeNanos",      "()J",
12095f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly            (void*) android_os_SystemClock_elapsedRealtimeNano },
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_os_SystemClock(JNIEnv* env)
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
124ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    return RegisterMethodsOrDie(env, "android/os/SystemClock", gMethods, NELEM(gMethods));
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
129