summaryrefslogtreecommitdiffstats
path: root/core/jni/android_util_Log.cpp
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2008-10-21 07:00:00 -0700
committerThe Android Open Source Project <initial-contribution@android.com>2008-10-21 07:00:00 -0700
commit54b6cfa9a9e5b861a9930af873580d6dc20f773c (patch)
tree35051494d2af230dce54d6b31c6af8fc24091316 /core/jni/android_util_Log.cpp
downloadframeworks_base-54b6cfa9a9e5b861a9930af873580d6dc20f773c.zip
frameworks_base-54b6cfa9a9e5b861a9930af873580d6dc20f773c.tar.gz
frameworks_base-54b6cfa9a9e5b861a9930af873580d6dc20f773c.tar.bz2
Initial Contribution
Diffstat (limited to 'core/jni/android_util_Log.cpp')
-rw-r--r--core/jni/android_util_Log.cpp161
1 files changed, 161 insertions, 0 deletions
diff --git a/core/jni/android_util_Log.cpp b/core/jni/android_util_Log.cpp
new file mode 100644
index 0000000..8316b03
--- /dev/null
+++ b/core/jni/android_util_Log.cpp
@@ -0,0 +1,161 @@
+/* //device/libs/android_runtime/android_util_Log.cpp
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+#define LOG_NAMESPACE "log.tag."
+#define LOG_TAG "Log_println"
+
+#include <assert.h>
+#include <cutils/properties.h>
+#include <utils/Log.h>
+#include <utils/String8.h>
+
+#include "jni.h"
+#include "utils/misc.h"
+#include "android_runtime/AndroidRuntime.h"
+
+#define MIN(a,b) ((a<b)?a:b)
+
+namespace android {
+
+struct levels_t {
+ jint verbose;
+ jint debug;
+ jint info;
+ jint warn;
+ jint error;
+ jint assert;
+};
+static levels_t levels;
+
+static int toLevel(const char* value)
+{
+ switch (value[0]) {
+ case 'V': return levels.verbose;
+ case 'D': return levels.debug;
+ case 'I': return levels.info;
+ case 'W': return levels.warn;
+ case 'E': return levels.error;
+ case 'A': return levels.assert;
+ case 'S': return -1; // SUPPRESS
+ }
+ return levels.info;
+}
+
+static jboolean android_util_Log_isLoggable(JNIEnv* env, jobject clazz, jstring tag, jint level)
+{
+#ifndef HAVE_ANDROID_OS
+ return false;
+#else /* HAVE_ANDROID_OS */
+ int len;
+ char key[PROPERTY_KEY_MAX];
+ char buf[PROPERTY_VALUE_MAX];
+
+ if (tag == NULL) {
+ return false;
+ }
+
+ jboolean result = false;
+
+ const char* chars = env->GetStringUTFChars(tag, NULL);
+
+ if ((strlen(chars)+sizeof(LOG_NAMESPACE)) > PROPERTY_KEY_MAX) {
+ jclass clazz = env->FindClass("java/lang/IllegalArgumentException");
+ char buf2[200];
+ snprintf(buf2, sizeof(buf2), "Log tag \"%s\" exceeds limit of %d characters\n",
+ chars, PROPERTY_KEY_MAX - sizeof(LOG_NAMESPACE));
+
+ // release the chars!
+ env->ReleaseStringUTFChars(tag, chars);
+
+ env->ThrowNew(clazz, buf2);
+ return false;
+ } else {
+ strncpy(key, LOG_NAMESPACE, sizeof(LOG_NAMESPACE)-1);
+ strcpy(key + sizeof(LOG_NAMESPACE) - 1, chars);
+ }
+
+ env->ReleaseStringUTFChars(tag, chars);
+
+ len = property_get(key, buf, "");
+ int logLevel = toLevel(buf);
+ return (logLevel >= 0 && level >= logLevel) ? true : false;
+#endif /* HAVE_ANDROID_OS */
+}
+
+/*
+ * In class android.util.Log:
+ * public static native int println(int priority, String tag, String msg)
+ */
+static jint android_util_Log_println(JNIEnv* env, jobject clazz,
+ jint priority, jstring tagObj, jstring msgObj)
+{
+ const char* tag = NULL;
+ const char* msg = NULL;
+
+ if (msgObj == NULL) {
+ jclass npeClazz;
+
+ npeClazz = env->FindClass("java/lang/NullPointerException");
+ assert(npeClazz != NULL);
+
+ env->ThrowNew(npeClazz, "println needs a message");
+ return -1;
+ }
+
+ if (tagObj != NULL)
+ tag = env->GetStringUTFChars(tagObj, NULL);
+ msg = env->GetStringUTFChars(msgObj, NULL);
+
+ int res = android_writeLog((android_LogPriority) priority, tag, msg);
+
+ if (tag != NULL)
+ env->ReleaseStringUTFChars(tagObj, tag);
+ env->ReleaseStringUTFChars(msgObj, msg);
+
+ return res;
+}
+
+/*
+ * JNI registration.
+ */
+static JNINativeMethod gMethods[] = {
+ /* name, signature, funcPtr */
+ { "isLoggable", "(Ljava/lang/String;I)Z", (void*) android_util_Log_isLoggable },
+ { "println", "(ILjava/lang/String;Ljava/lang/String;)I", (void*) android_util_Log_println },
+};
+
+int register_android_util_Log(JNIEnv* env)
+{
+ jclass clazz = env->FindClass("android/util/Log");
+
+ if (clazz == NULL) {
+ LOGE("Can't find android/util/Log");
+ return -1;
+ }
+
+ levels.verbose = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "VERBOSE", "I"));
+ levels.debug = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "DEBUG", "I"));
+ levels.info = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "INFO", "I"));
+ levels.warn = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "WARN", "I"));
+ levels.error = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "ERROR", "I"));
+ levels.assert = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "ASSERT", "I"));
+
+ return AndroidRuntime::registerNativeMethods(env, "android/util/Log", gMethods, NELEM(gMethods));
+}
+
+}; // namespace android
+