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