SystemProperties: eliminate unnecessary string allocation.

getInt(), getLong() and getBoolean() no longer allocate a temporary String object.

Signed-off-by: Mike Lockwood <lockwood@android.com>
diff --git a/core/jni/android_os_SystemProperties.cpp b/core/jni/android_os_SystemProperties.cpp
index ca4fa11..406884b 100644
--- a/core/jni/android_os_SystemProperties.cpp
+++ b/core/jni/android_os_SystemProperties.cpp
@@ -36,9 +36,9 @@
                                 "key must not be null.");
         goto error;
     }
-    
+
     key = env->GetStringUTFChars(keyJ, NULL);
-    
+
     len = property_get(key, buf, "");
     if ((len <= 0) && (defJ != NULL)) {
         rvJ = defJ;
@@ -47,9 +47,9 @@
     } else {
         rvJ = env->NewStringUTF("");
     }
-    
+
     env->ReleaseStringUTFChars(keyJ, key);
-    
+
 error:
     return rvJ;
 }
@@ -60,6 +60,101 @@
     return SystemProperties_getSS(env, clazz, keyJ, NULL);
 }
 
+static jint SystemProperties_get_int(JNIEnv *env, jobject clazz,
+                                      jstring keyJ, jint defJ)
+{
+    int len;
+    const char* key;
+    char buf[PROPERTY_VALUE_MAX];
+    jint result = defJ;
+
+    if (keyJ == NULL) {
+        jniThrowException(env, "java/lang/NullPointerException",
+                                "key must not be null.");
+        goto error;
+    }
+
+    key = env->GetStringUTFChars(keyJ, NULL);
+
+    len = property_get(key, buf, "");
+    if (len > 0) {
+        jint temp;
+        if (sscanf(buf, "%d", &temp) == 1)
+            result = temp;
+    }
+
+    env->ReleaseStringUTFChars(keyJ, key);
+
+error:
+    return result;
+}
+
+static jlong SystemProperties_get_long(JNIEnv *env, jobject clazz,
+                                      jstring keyJ, jlong defJ)
+{
+    int len;
+    const char* key;
+    char buf[PROPERTY_VALUE_MAX];
+    jlong result = defJ;
+
+    if (keyJ == NULL) {
+        jniThrowException(env, "java/lang/NullPointerException",
+                                "key must not be null.");
+        goto error;
+    }
+
+    key = env->GetStringUTFChars(keyJ, NULL);
+
+    len = property_get(key, buf, "");
+    if (len > 0) {
+        jlong temp;
+        if (sscanf(buf, "%lld", &temp) == 1)
+            result = temp;
+    }
+
+    env->ReleaseStringUTFChars(keyJ, key);
+
+error:
+    return result;
+}
+
+static jboolean SystemProperties_get_boolean(JNIEnv *env, jobject clazz,
+                                      jstring keyJ, jboolean defJ)
+{
+    int len;
+    const char* key;
+    char buf[PROPERTY_VALUE_MAX];
+    jboolean result = defJ;
+
+    if (keyJ == NULL) {
+        jniThrowException(env, "java/lang/NullPointerException",
+                                "key must not be null.");
+        goto error;
+    }
+
+    key = env->GetStringUTFChars(keyJ, NULL);
+
+    len = property_get(key, buf, "");
+    if (len == 1) {
+        char ch = buf[0];
+        if (ch == '0' || ch == 'n')
+            result = false;
+        else if (ch == '1' || ch == 'y')
+            result = true;
+    } else if (len > 1) {
+         if (!strcmp(buf, "no") || !strcmp(buf, "false") || !strcmp(buf, "off")) {
+            result = false;
+        } else if (!strcmp(buf, "yes") || !strcmp(buf, "true") || !strcmp(buf, "on")) {
+            result = true;
+        }
+    }
+
+    env->ReleaseStringUTFChars(keyJ, key);
+
+error:
+    return result;
+}
+
 static void SystemProperties_set(JNIEnv *env, jobject clazz,
                                       jstring keyJ, jstring valJ)
 {
@@ -94,6 +189,12 @@
       (void*) SystemProperties_getS },
     { "native_get", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",
       (void*) SystemProperties_getSS },
+    { "native_get_int", "(Ljava/lang/String;I)I",
+      (void*) SystemProperties_get_int },
+    { "native_get_long", "(Ljava/lang/String;J)J",
+      (void*) SystemProperties_get_long },
+    { "native_get_boolean", "(Ljava/lang/String;Z)Z",
+      (void*) SystemProperties_get_boolean },
     { "native_set", "(Ljava/lang/String;Ljava/lang/String;)V",
       (void*) SystemProperties_set },
 };