Home | History | Annotate | Download | only in jni
      1 /*
      2  * Copyright (C) 2012 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 #define LOG_TAG "Trace"
     18 // #define LOG_NDEBUG 0
     19 
     20 #include <inttypes.h>
     21 
     22 #include <cutils/trace.h>
     23 #include <utils/String8.h>
     24 #include <log/log.h>
     25 
     26 #include <nativehelper/JNIHelp.h>
     27 #include <nativehelper/ScopedUtfChars.h>
     28 #include <nativehelper/ScopedStringChars.h>
     29 
     30 namespace android {
     31 
     32 static void sanitizeString(String8& utf8Chars) {
     33     size_t size = utf8Chars.size();
     34     char* str = utf8Chars.lockBuffer(size);
     35     for (size_t i = 0; i < size; i++) {
     36         char c = str[i];
     37         if (c == '\0' || c == '\n' || c == '|') {
     38             str[i] = ' ';
     39         }
     40     }
     41     utf8Chars.unlockBuffer();
     42 }
     43 
     44 static jlong android_os_Trace_nativeGetEnabledTags(JNIEnv* env, jclass clazz) {
     45     return atrace_get_enabled_tags();
     46 }
     47 
     48 static void android_os_Trace_nativeTraceCounter(JNIEnv* env, jclass clazz,
     49         jlong tag, jstring nameStr, jint value) {
     50     ScopedUtfChars name(env, nameStr);
     51 
     52     ALOGV("%s: %" PRId64 " %s %d", __FUNCTION__, tag, name.c_str(), value);
     53     atrace_int(tag, name.c_str(), value);
     54 }
     55 
     56 static void android_os_Trace_nativeTraceBegin(JNIEnv* env, jclass clazz,
     57         jlong tag, jstring nameStr) {
     58     ScopedStringChars jchars(env, nameStr);
     59     String8 utf8Chars(reinterpret_cast<const char16_t*>(jchars.get()), jchars.size());
     60     sanitizeString(utf8Chars);
     61 
     62     ALOGV("%s: %" PRId64 " %s", __FUNCTION__, tag, utf8Chars.string());
     63     atrace_begin(tag, utf8Chars.string());
     64 }
     65 
     66 static void android_os_Trace_nativeTraceEnd(JNIEnv* env, jclass clazz,
     67         jlong tag) {
     68 
     69     ALOGV("%s: %" PRId64, __FUNCTION__, tag);
     70     atrace_end(tag);
     71 }
     72 
     73 static void android_os_Trace_nativeAsyncTraceBegin(JNIEnv* env, jclass clazz,
     74         jlong tag, jstring nameStr, jint cookie) {
     75     ScopedStringChars jchars(env, nameStr);
     76     String8 utf8Chars(reinterpret_cast<const char16_t*>(jchars.get()), jchars.size());
     77     sanitizeString(utf8Chars);
     78 
     79     ALOGV("%s: %" PRId64 " %s %d", __FUNCTION__, tag, utf8Chars.string(), cookie);
     80     atrace_async_begin(tag, utf8Chars.string(), cookie);
     81 }
     82 
     83 static void android_os_Trace_nativeAsyncTraceEnd(JNIEnv* env, jclass clazz,
     84         jlong tag, jstring nameStr, jint cookie) {
     85     ScopedStringChars jchars(env, nameStr);
     86     String8 utf8Chars(reinterpret_cast<const char16_t*>(jchars.get()), jchars.size());
     87     sanitizeString(utf8Chars);
     88 
     89     ALOGV("%s: %" PRId64 " %s %d", __FUNCTION__, tag, utf8Chars.string(), cookie);
     90     atrace_async_end(tag, utf8Chars.string(), cookie);
     91 }
     92 
     93 static void android_os_Trace_nativeSetAppTracingAllowed(JNIEnv* env,
     94         jclass clazz, jboolean allowed) {
     95     ALOGV("%s: %d", __FUNCTION__, allowed);
     96 
     97     atrace_set_debuggable(allowed);
     98 }
     99 
    100 static void android_os_Trace_nativeSetTracingEnabled(JNIEnv* env,
    101         jclass clazz, jboolean enabled) {
    102     ALOGV("%s: %d", __FUNCTION__, enabled);
    103 
    104     atrace_set_tracing_enabled(enabled);
    105 }
    106 
    107 static const JNINativeMethod gTraceMethods[] = {
    108     /* name, signature, funcPtr */
    109     { "nativeGetEnabledTags",
    110             "()J",
    111             (void*)android_os_Trace_nativeGetEnabledTags },
    112     { "nativeSetAppTracingAllowed",
    113             "(Z)V",
    114             (void*)android_os_Trace_nativeSetAppTracingAllowed },
    115     { "nativeSetTracingEnabled",
    116             "(Z)V",
    117             (void*)android_os_Trace_nativeSetTracingEnabled },
    118 
    119     // ----------- @FastNative  ----------------
    120 
    121     { "nativeTraceCounter",
    122             "(JLjava/lang/String;I)V",
    123             (void*)android_os_Trace_nativeTraceCounter },
    124     { "nativeTraceBegin",
    125             "(JLjava/lang/String;)V",
    126             (void*)android_os_Trace_nativeTraceBegin },
    127     { "nativeTraceEnd",
    128             "(J)V",
    129             (void*)android_os_Trace_nativeTraceEnd },
    130     { "nativeAsyncTraceBegin",
    131             "(JLjava/lang/String;I)V",
    132             (void*)android_os_Trace_nativeAsyncTraceBegin },
    133     { "nativeAsyncTraceEnd",
    134             "(JLjava/lang/String;I)V",
    135             (void*)android_os_Trace_nativeAsyncTraceEnd },
    136 };
    137 
    138 int register_android_os_Trace(JNIEnv* env) {
    139     int res = jniRegisterNativeMethods(env, "android/os/Trace",
    140             gTraceMethods, NELEM(gTraceMethods));
    141     LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods.");
    142 
    143     return 0;
    144 }
    145 
    146 } // namespace android
    147