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"
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_runtime/AndroidRuntime.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#if defined(HAVE_POSIX_CLOCKS)
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct timespec tm;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tm);
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return tm.tv_sec * 1000LL + tm.tv_nsec / 1000000;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct timeval tv;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gettimeofday(&tv, NULL);
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return tv.tv_sec * 1000LL + tv.tv_usec / 1000;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
78648bee18a1ccd362445d562729250ff5910f16a0Romain Guy * native public static long currentThreadTimeMicro();
79648bee18a1ccd362445d562729250ff5910f16a0Romain Guy */
80648bee18a1ccd362445d562729250ff5910f16a0Romain Guystatic jlong android_os_SystemClock_currentThreadTimeMicro(JNIEnv* env,
81648bee18a1ccd362445d562729250ff5910f16a0Romain Guy        jobject clazz)
82648bee18a1ccd362445d562729250ff5910f16a0Romain Guy{
83648bee18a1ccd362445d562729250ff5910f16a0Romain Guy#if defined(HAVE_POSIX_CLOCKS)
84648bee18a1ccd362445d562729250ff5910f16a0Romain Guy    struct timespec tm;
85648bee18a1ccd362445d562729250ff5910f16a0Romain Guy
86648bee18a1ccd362445d562729250ff5910f16a0Romain Guy    clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tm);
87648bee18a1ccd362445d562729250ff5910f16a0Romain Guy
88648bee18a1ccd362445d562729250ff5910f16a0Romain Guy    return tm.tv_sec * 1000000LL + tm.tv_nsec / 1000;
89648bee18a1ccd362445d562729250ff5910f16a0Romain Guy#else
90648bee18a1ccd362445d562729250ff5910f16a0Romain Guy    struct timeval tv;
91648bee18a1ccd362445d562729250ff5910f16a0Romain Guy
92648bee18a1ccd362445d562729250ff5910f16a0Romain Guy    gettimeofday(&tv, NULL);
93648bee18a1ccd362445d562729250ff5910f16a0Romain Guy    return tv.tv_sec * 1000000LL + tv.tv_nsec / 1000;
94648bee18a1ccd362445d562729250ff5910f16a0Romain Guy#endif
95648bee18a1ccd362445d562729250ff5910f16a0Romain Guy}
96648bee18a1ccd362445d562729250ff5910f16a0Romain Guy
97648bee18a1ccd362445d562729250ff5910f16a0Romain Guy/*
98648bee18a1ccd362445d562729250ff5910f16a0Romain Guy * native public static long currentTimeMicro();
99648bee18a1ccd362445d562729250ff5910f16a0Romain Guy */
100648bee18a1ccd362445d562729250ff5910f16a0Romain Guystatic jlong android_os_SystemClock_currentTimeMicro(JNIEnv* env,
101648bee18a1ccd362445d562729250ff5910f16a0Romain Guy        jobject clazz)
102648bee18a1ccd362445d562729250ff5910f16a0Romain Guy{
103648bee18a1ccd362445d562729250ff5910f16a0Romain Guy    struct timeval tv;
104648bee18a1ccd362445d562729250ff5910f16a0Romain Guy
105648bee18a1ccd362445d562729250ff5910f16a0Romain Guy    gettimeofday(&tv, NULL);
106648bee18a1ccd362445d562729250ff5910f16a0Romain Guy    return tv.tv_sec * 1000000LL + tv.tv_usec;
107648bee18a1ccd362445d562729250ff5910f16a0Romain Guy}
108648bee18a1ccd362445d562729250ff5910f16a0Romain Guy
109648bee18a1ccd362445d562729250ff5910f16a0Romain Guy/*
11095f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly * public static native long elapsedRealtimeNano();
11195f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly */
11295f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pellystatic jlong android_os_SystemClock_elapsedRealtimeNano(JNIEnv* env,
11395f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly        jobject clazz)
11495f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly{
11595f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly    return (jlong)elapsedRealtimeNano();
11695f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly}
11795f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly
11895f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly/*
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration.
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMethods[] = {
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* name, signature, funcPtr */
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "uptimeMillis",      "()J",
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (void*) android_os_SystemClock_uptimeMillis },
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "elapsedRealtime",      "()J",
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (void*) android_os_SystemClock_elapsedRealtime },
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "currentThreadTimeMillis",      "()J",
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (void*) android_os_SystemClock_currentThreadTimeMillis },
129648bee18a1ccd362445d562729250ff5910f16a0Romain Guy    { "currentThreadTimeMicro",       "()J",
130648bee18a1ccd362445d562729250ff5910f16a0Romain Guy            (void*) android_os_SystemClock_currentThreadTimeMicro },
131648bee18a1ccd362445d562729250ff5910f16a0Romain Guy    { "currentTimeMicro",             "()J",
132648bee18a1ccd362445d562729250ff5910f16a0Romain Guy            (void*) android_os_SystemClock_currentTimeMicro },
133dd78d462f6dceac71f9d1cbb723bb38a3b5bdc2eJeff Sharkey    { "elapsedRealtimeNanos",      "()J",
13495f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly            (void*) android_os_SystemClock_elapsedRealtimeNano },
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_os_SystemClock(JNIEnv* env)
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return AndroidRuntime::registerNativeMethods(env,
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "android/os/SystemClock", gMethods, NELEM(gMethods));
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
144