android_os_Trace.cpp revision f9c7d6bc15b68393c1f0aa85c3c023c31244c3f2
1fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek/* 2b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek * Copyright (C) 2012 The Android Open Source Project 3b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek * 4b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek * Licensed under the Apache License, Version 2.0 (the "License"); 5b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek * you may not use this file except in compliance with the License. 6b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek * You may obtain a copy of the License at 7b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek * 8b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek * http://www.apache.org/licenses/LICENSE-2.0 9b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek * 10fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek * Unless required by applicable law or agreed to in writing, software 11fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek * distributed under the License is distributed on an "AS IS" BASIS, 12b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek * See the License for the specific language governing permissions and 14b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek * limitations under the License. 15fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek */ 16fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek 17b315a3940f804cf9fc67f4e3314aac6a44d623eeTed Kremenek#define LOG_TAG "Trace" 18991c54b9b7409656e5593364e065878b5210d556Ted Kremenek 19991c54b9b7409656e5593364e065878b5210d556Ted Kremenek#include <JNIHelp.h> 20ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek#include <ScopedUtfChars.h> 211df35e310d3402879857dd78f6fa9aaeb94b35c4Ted Kremenek#include <ScopedStringChars.h> 222ec5cd553542ec54652fb2ae2395e46795b1af84Ted Kremenek 232ec5cd553542ec54652fb2ae2395e46795b1af84Ted Kremenek#include <utils/String8.h> 242ec5cd553542ec54652fb2ae2395e46795b1af84Ted Kremenek 25e600bedcfea91622a0003fdb5f66c500b2f9f17dTed Kremenek#include <cutils/trace.h> 26e600bedcfea91622a0003fdb5f66c500b2f9f17dTed Kremenek#include <cutils/log.h> 27e600bedcfea91622a0003fdb5f66c500b2f9f17dTed Kremenek 28e600bedcfea91622a0003fdb5f66c500b2f9f17dTed Kremeneknamespace android { 29ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek 30ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenekstatic jlong android_os_Trace_nativeGetEnabledTags(JNIEnv* env, jclass clazz) { 31ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek return atrace_get_enabled_tags(); 32ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek} 33ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek 34ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenekstatic void android_os_Trace_nativeTraceCounter(JNIEnv* env, jclass clazz, 35ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek jlong tag, jstring nameStr, jint value) { 36ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek ScopedUtfChars name(env, nameStr); 37ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek atrace_int(tag, name.c_str(), value); 38ddf32dabe71f00aa0943449f67201f587f0a04d6Ted Kremenek} 39991c54b9b7409656e5593364e065878b5210d556Ted Kremenek 40991c54b9b7409656e5593364e065878b5210d556Ted Kremenekstatic void android_os_Trace_nativeTraceBegin(JNIEnv* env, jclass clazz, 41991c54b9b7409656e5593364e065878b5210d556Ted Kremenek jlong tag, jstring nameStr) { 42991c54b9b7409656e5593364e065878b5210d556Ted Kremenek const size_t MAX_SECTION_NAME_LEN = 127; 43991c54b9b7409656e5593364e065878b5210d556Ted Kremenek ScopedStringChars jchars(env, nameStr); 44991c54b9b7409656e5593364e065878b5210d556Ted Kremenek String8 utf8Chars(reinterpret_cast<const char16_t*>(jchars.get()), 45991c54b9b7409656e5593364e065878b5210d556Ted Kremenek jchars.size()); 46991c54b9b7409656e5593364e065878b5210d556Ted Kremenek size_t size = utf8Chars.size(); 47991c54b9b7409656e5593364e065878b5210d556Ted Kremenek char* str = utf8Chars.lockBuffer(size); 48991c54b9b7409656e5593364e065878b5210d556Ted Kremenek for (size_t i = 0; i < size; i++) { 49a4d8cde6584aa6c1aee241faf671eb4bac93defbTed Kremenek char c = str[i]; 50a4d8cde6584aa6c1aee241faf671eb4bac93defbTed Kremenek if (c == '\0' || c == '\n' || c == '|') { 515daa3be1bf9db399aa7510bbcf2bfc8c7701b6daTed Kremenek str[i] = ' '; 52a4d8cde6584aa6c1aee241faf671eb4bac93defbTed Kremenek } 53938eef139ad43345248235da31f78a759dd18f13Ted Kremenek } 545daa3be1bf9db399aa7510bbcf2bfc8c7701b6daTed Kremenek utf8Chars.unlockBuffer(); 555d31f83bbe990aeb070ce6c8d919d229d4eb5052Ted Kremenek atrace_begin(tag, utf8Chars.string()); 56fd9df0eddd7d2b190f740f33a3d08f611c0be3f0Ted Kremenek} 57938eef139ad43345248235da31f78a759dd18f13Ted Kremenek 58991c54b9b7409656e5593364e065878b5210d556Ted Kremenekstatic void android_os_Trace_nativeTraceEnd(JNIEnv* env, jclass clazz, 595daa3be1bf9db399aa7510bbcf2bfc8c7701b6daTed Kremenek jlong tag) { 605daa3be1bf9db399aa7510bbcf2bfc8c7701b6daTed Kremenek atrace_end(tag); 61938eef139ad43345248235da31f78a759dd18f13Ted Kremenek} 62938eef139ad43345248235da31f78a759dd18f13Ted Kremenek 63938eef139ad43345248235da31f78a759dd18f13Ted Kremenekstatic void android_os_Trace_nativeSetAppTracingAllowed(JNIEnv* env, 64938eef139ad43345248235da31f78a759dd18f13Ted Kremenek jclass clazz, jboolean allowed) { 65938eef139ad43345248235da31f78a759dd18f13Ted Kremenek atrace_set_debuggable(allowed); 66938eef139ad43345248235da31f78a759dd18f13Ted Kremenek} 67c3998fa64e254b13669e8cf3a0cf23eb4f73b88bTed Kremenek 683386c8a510abc6f55ce25ef5e22c72e5d0c47a70Ted Kremenekstatic JNINativeMethod gTraceMethods[] = { 695daa3be1bf9db399aa7510bbcf2bfc8c7701b6daTed Kremenek /* name, signature, funcPtr */ 705daa3be1bf9db399aa7510bbcf2bfc8c7701b6daTed Kremenek { "nativeGetEnabledTags", 715daa3be1bf9db399aa7510bbcf2bfc8c7701b6daTed Kremenek "()J", 723386c8a510abc6f55ce25ef5e22c72e5d0c47a70Ted Kremenek (void*)android_os_Trace_nativeGetEnabledTags }, 73991c54b9b7409656e5593364e065878b5210d556Ted Kremenek { "nativeTraceCounter", 74c3998fa64e254b13669e8cf3a0cf23eb4f73b88bTed Kremenek "(JLjava/lang/String;I)V", 75c3998fa64e254b13669e8cf3a0cf23eb4f73b88bTed Kremenek (void*)android_os_Trace_nativeTraceCounter }, 7682a1253077cd0832e4d347062b911cd305ab62d1Ted Kremenek { "nativeTraceBegin", 775f2825f6fa24a792c11cf96accd76538a2fd951eTed Kremenek "(JLjava/lang/String;)V", 785d31f83bbe990aeb070ce6c8d919d229d4eb5052Ted Kremenek (void*)android_os_Trace_nativeTraceBegin }, 792dd7ad13bbbd43cb940040725a30cb7789bd2774Ted Kremenek { "nativeTraceEnd", 80991c54b9b7409656e5593364e065878b5210d556Ted Kremenek "(J)V", 8182a1253077cd0832e4d347062b911cd305ab62d1Ted Kremenek (void*)android_os_Trace_nativeTraceEnd }, 8282a1253077cd0832e4d347062b911cd305ab62d1Ted Kremenek { "nativeSetAppTracingAllowed", 839f9b1fded49acff77e61b3ed1afc8bbaaefe6f34Ted Kremenek "(Z)V", 84938eef139ad43345248235da31f78a759dd18f13Ted Kremenek (void*)android_os_Trace_nativeSetAppTracingAllowed }, 85991c54b9b7409656e5593364e065878b5210d556Ted Kremenek}; 86b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek 87fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenekint register_android_os_Trace(JNIEnv* env) { 88fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek int res = jniRegisterNativeMethods(env, "android/os/Trace", 89fbeeca84dd1993d2656e9a259f5d7ee54fe3b162Ted Kremenek gTraceMethods, NELEM(gTraceMethods)); 90b0982880c09a07147b5a9ad275393fedff13aad0Ted Kremenek LOG_FATAL_IF(res < 0, "Unable to register native methods."); 91fd9df0eddd7d2b190f740f33a3d08f611c0be3f0Ted Kremenek 92fd9df0eddd7d2b190f740f33a3d08f611c0be3f0Ted Kremenek return 0; 93fd9df0eddd7d2b190f740f33a3d08f611c0be3f0Ted Kremenek} 94fd9df0eddd7d2b190f740f33a3d08f611c0be3f0Ted Kremenek 95fd9df0eddd7d2b190f740f33a3d08f611c0be3f0Ted Kremenek} // namespace android 96fd9df0eddd7d2b190f740f33a3d08f611c0be3f0Ted Kremenek