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