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
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h"
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h"
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_runtime/AndroidRuntime.h"
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "utils/SystemClock.h"
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/time.h>
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <time.h>
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * native public static void setCurrentTimeMillis(long millis)
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the current time.  This only works when running as root.
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_os_SystemClock_setCurrentTimeMillis(JNIEnv* env,
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jobject clazz, jlong millis)
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (setCurrentTimeMillis(millis) == 0);
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * native public static long uptimeMillis();
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_os_SystemClock_uptimeMillis(JNIEnv* env,
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jobject clazz)
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jlong)uptimeMillis();
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * native public static long elapsedRealtime();
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_os_SystemClock_elapsedRealtime(JNIEnv* env,
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jobject clazz)
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jlong)elapsedRealtime();
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * native public static long currentThreadTimeMillis();
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_os_SystemClock_currentThreadTimeMillis(JNIEnv* env,
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jobject clazz)
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if defined(HAVE_POSIX_CLOCKS)
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct timespec tm;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tm);
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return tm.tv_sec * 1000LL + tm.tv_nsec / 1000000;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct timeval tv;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gettimeofday(&tv, NULL);
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return tv.tv_sec * 1000LL + tv.tv_usec / 1000;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration.
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMethods[] = {
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* name, signature, funcPtr */
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "setCurrentTimeMillis",      "(J)Z",
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (void*) android_os_SystemClock_setCurrentTimeMillis },
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "uptimeMillis",      "()J",
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (void*) android_os_SystemClock_uptimeMillis },
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "elapsedRealtime",      "()J",
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (void*) android_os_SystemClock_elapsedRealtime },
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "currentThreadTimeMillis",      "()J",
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (void*) android_os_SystemClock_currentThreadTimeMillis },
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_os_SystemClock(JNIEnv* env)
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return AndroidRuntime::registerNativeMethods(env,
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "android/os/SystemClock", gMethods, NELEM(gMethods));
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
104