android_os_SystemClock.cpp revision 38bf51466881b726f42832743d8cca6ee67bb148
1/* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 18/* 19 * System clock functions. 20 */ 21 22#include <sys/time.h> 23#include <limits.h> 24#include <fcntl.h> 25#include <errno.h> 26#include <string.h> 27 28#include "JNIHelp.h" 29#include "jni.h" 30#include "android_runtime/AndroidRuntime.h" 31 32#include <sys/time.h> 33#include <time.h> 34 35#include <utils/SystemClock.h> 36 37namespace android { 38 39/* 40 * native public static long uptimeMillis(); 41 */ 42static jlong android_os_SystemClock_uptimeMillis(JNIEnv* env, 43 jobject clazz) 44{ 45 return (jlong)uptimeMillis(); 46} 47 48/* 49 * native public static long elapsedRealtime(); 50 */ 51static jlong android_os_SystemClock_elapsedRealtime(JNIEnv* env, 52 jobject clazz) 53{ 54 return (jlong)elapsedRealtime(); 55} 56 57/* 58 * native public static long currentThreadTimeMillis(); 59 */ 60static jlong android_os_SystemClock_currentThreadTimeMillis(JNIEnv* env, 61 jobject clazz) 62{ 63#if defined(HAVE_POSIX_CLOCKS) 64 struct timespec tm; 65 66 clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tm); 67 68 return tm.tv_sec * 1000LL + tm.tv_nsec / 1000000; 69#else 70 struct timeval tv; 71 72 gettimeofday(&tv, NULL); 73 return tv.tv_sec * 1000LL + tv.tv_usec / 1000; 74#endif 75} 76 77/* 78 * native public static long currentThreadTimeMicro(); 79 */ 80static jlong android_os_SystemClock_currentThreadTimeMicro(JNIEnv* env, 81 jobject clazz) 82{ 83#if defined(HAVE_POSIX_CLOCKS) 84 struct timespec tm; 85 86 clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tm); 87 88 return tm.tv_sec * 1000000LL + tm.tv_nsec / 1000; 89#else 90 struct timeval tv; 91 92 gettimeofday(&tv, NULL); 93 return tv.tv_sec * 1000000LL + tv.tv_nsec / 1000; 94#endif 95} 96 97/* 98 * native public static long currentTimeMicro(); 99 */ 100static jlong android_os_SystemClock_currentTimeMicro(JNIEnv* env, 101 jobject clazz) 102{ 103 struct timeval tv; 104 105 gettimeofday(&tv, NULL); 106 return tv.tv_sec * 1000000LL + tv.tv_usec; 107} 108 109/* 110 * public static native long elapsedRealtimeNano(); 111 */ 112static jlong android_os_SystemClock_elapsedRealtimeNano(JNIEnv* env, 113 jobject clazz) 114{ 115 return (jlong)elapsedRealtimeNano(); 116} 117 118/* 119 * JNI registration. 120 */ 121static JNINativeMethod gMethods[] = { 122 /* name, signature, funcPtr */ 123 { "uptimeMillis", "()J", 124 (void*) android_os_SystemClock_uptimeMillis }, 125 { "elapsedRealtime", "()J", 126 (void*) android_os_SystemClock_elapsedRealtime }, 127 { "currentThreadTimeMillis", "()J", 128 (void*) android_os_SystemClock_currentThreadTimeMillis }, 129 { "currentThreadTimeMicro", "()J", 130 (void*) android_os_SystemClock_currentThreadTimeMicro }, 131 { "currentTimeMicro", "()J", 132 (void*) android_os_SystemClock_currentTimeMicro }, 133 { "elapsedRealtimeNanos", "()J", 134 (void*) android_os_SystemClock_elapsedRealtimeNano }, 135}; 136int register_android_os_SystemClock(JNIEnv* env) 137{ 138 return AndroidRuntime::registerNativeMethods(env, 139 "android/os/SystemClock", gMethods, NELEM(gMethods)); 140} 141 142}; // namespace android 143 144