19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* //device/libs/android_runtime/android_os_SystemProperties.cpp
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2006, The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes** Licensed under the Apache License, Version 2.0 (the "License");
669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes** you may not use this file except in compliance with the License.
769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes** You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes**     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
1169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes** Unless required by applicable law or agreed to in writing, software
1269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes** distributed under the License is distributed on an "AS IS" BASIS,
1369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes** See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn#define LOG_TAG "SysPropJNI"
19a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "cutils/properties.h"
21a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn#include "utils/misc.h"
22a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn#include <utils/Log.h>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h"
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_runtime/AndroidRuntime.h"
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <nativehelper/JNIHelp.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring SystemProperties_getSS(JNIEnv *env, jobject clazz,
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                      jstring keyJ, jstring defJ)
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int len;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* key;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char buf[PROPERTY_VALUE_MAX];
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jstring rvJ = NULL;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (keyJ == NULL) {
3969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "key must not be null.");
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto error;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42d1945950451220932f70bac83408c761dcba231fMike Lockwood
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    key = env->GetStringUTFChars(keyJ, NULL);
44d1945950451220932f70bac83408c761dcba231fMike Lockwood
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    len = property_get(key, buf, "");
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if ((len <= 0) && (defJ != NULL)) {
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        rvJ = defJ;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (len >= 0) {
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        rvJ = env->NewStringUTF(buf);
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        rvJ = env->NewStringUTF("");
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
53d1945950451220932f70bac83408c761dcba231fMike Lockwood
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseStringUTFChars(keyJ, key);
55d1945950451220932f70bac83408c761dcba231fMike Lockwood
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecterror:
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return rvJ;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring SystemProperties_getS(JNIEnv *env, jobject clazz,
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                      jstring keyJ)
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return SystemProperties_getSS(env, clazz, keyJ, NULL);
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66d1945950451220932f70bac83408c761dcba231fMike Lockwoodstatic jint SystemProperties_get_int(JNIEnv *env, jobject clazz,
67d1945950451220932f70bac83408c761dcba231fMike Lockwood                                      jstring keyJ, jint defJ)
68d1945950451220932f70bac83408c761dcba231fMike Lockwood{
69d1945950451220932f70bac83408c761dcba231fMike Lockwood    int len;
70d1945950451220932f70bac83408c761dcba231fMike Lockwood    const char* key;
71d1945950451220932f70bac83408c761dcba231fMike Lockwood    char buf[PROPERTY_VALUE_MAX];
7283e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn    char* end;
73d1945950451220932f70bac83408c761dcba231fMike Lockwood    jint result = defJ;
74d1945950451220932f70bac83408c761dcba231fMike Lockwood
75d1945950451220932f70bac83408c761dcba231fMike Lockwood    if (keyJ == NULL) {
7669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "key must not be null.");
77d1945950451220932f70bac83408c761dcba231fMike Lockwood        goto error;
78d1945950451220932f70bac83408c761dcba231fMike Lockwood    }
79d1945950451220932f70bac83408c761dcba231fMike Lockwood
80d1945950451220932f70bac83408c761dcba231fMike Lockwood    key = env->GetStringUTFChars(keyJ, NULL);
81d1945950451220932f70bac83408c761dcba231fMike Lockwood
82d1945950451220932f70bac83408c761dcba231fMike Lockwood    len = property_get(key, buf, "");
83d1945950451220932f70bac83408c761dcba231fMike Lockwood    if (len > 0) {
8483e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn        result = strtol(buf, &end, 0);
8583e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn        if (end == buf) {
8683e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn            result = defJ;
8783e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn        }
88d1945950451220932f70bac83408c761dcba231fMike Lockwood    }
89d1945950451220932f70bac83408c761dcba231fMike Lockwood
90d1945950451220932f70bac83408c761dcba231fMike Lockwood    env->ReleaseStringUTFChars(keyJ, key);
91d1945950451220932f70bac83408c761dcba231fMike Lockwood
92d1945950451220932f70bac83408c761dcba231fMike Lockwooderror:
93d1945950451220932f70bac83408c761dcba231fMike Lockwood    return result;
94d1945950451220932f70bac83408c761dcba231fMike Lockwood}
95d1945950451220932f70bac83408c761dcba231fMike Lockwood
96d1945950451220932f70bac83408c761dcba231fMike Lockwoodstatic jlong SystemProperties_get_long(JNIEnv *env, jobject clazz,
97d1945950451220932f70bac83408c761dcba231fMike Lockwood                                      jstring keyJ, jlong defJ)
98d1945950451220932f70bac83408c761dcba231fMike Lockwood{
99d1945950451220932f70bac83408c761dcba231fMike Lockwood    int len;
100d1945950451220932f70bac83408c761dcba231fMike Lockwood    const char* key;
101d1945950451220932f70bac83408c761dcba231fMike Lockwood    char buf[PROPERTY_VALUE_MAX];
10283e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn    char* end;
103d1945950451220932f70bac83408c761dcba231fMike Lockwood    jlong result = defJ;
104d1945950451220932f70bac83408c761dcba231fMike Lockwood
105d1945950451220932f70bac83408c761dcba231fMike Lockwood    if (keyJ == NULL) {
10669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "key must not be null.");
107d1945950451220932f70bac83408c761dcba231fMike Lockwood        goto error;
108d1945950451220932f70bac83408c761dcba231fMike Lockwood    }
109d1945950451220932f70bac83408c761dcba231fMike Lockwood
110d1945950451220932f70bac83408c761dcba231fMike Lockwood    key = env->GetStringUTFChars(keyJ, NULL);
111d1945950451220932f70bac83408c761dcba231fMike Lockwood
112d1945950451220932f70bac83408c761dcba231fMike Lockwood    len = property_get(key, buf, "");
113d1945950451220932f70bac83408c761dcba231fMike Lockwood    if (len > 0) {
11483e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn        result = strtoll(buf, &end, 0);
11583e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn        if (end == buf) {
11683e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn            result = defJ;
11783e6eb11d7ec24e7c363beccab0806989ad89ec5Dianne Hackborn        }
118d1945950451220932f70bac83408c761dcba231fMike Lockwood    }
119d1945950451220932f70bac83408c761dcba231fMike Lockwood
120d1945950451220932f70bac83408c761dcba231fMike Lockwood    env->ReleaseStringUTFChars(keyJ, key);
121d1945950451220932f70bac83408c761dcba231fMike Lockwood
122d1945950451220932f70bac83408c761dcba231fMike Lockwooderror:
123d1945950451220932f70bac83408c761dcba231fMike Lockwood    return result;
124d1945950451220932f70bac83408c761dcba231fMike Lockwood}
125d1945950451220932f70bac83408c761dcba231fMike Lockwood
126d1945950451220932f70bac83408c761dcba231fMike Lockwoodstatic jboolean SystemProperties_get_boolean(JNIEnv *env, jobject clazz,
127d1945950451220932f70bac83408c761dcba231fMike Lockwood                                      jstring keyJ, jboolean defJ)
128d1945950451220932f70bac83408c761dcba231fMike Lockwood{
129d1945950451220932f70bac83408c761dcba231fMike Lockwood    int len;
130d1945950451220932f70bac83408c761dcba231fMike Lockwood    const char* key;
131d1945950451220932f70bac83408c761dcba231fMike Lockwood    char buf[PROPERTY_VALUE_MAX];
132d1945950451220932f70bac83408c761dcba231fMike Lockwood    jboolean result = defJ;
133d1945950451220932f70bac83408c761dcba231fMike Lockwood
134d1945950451220932f70bac83408c761dcba231fMike Lockwood    if (keyJ == NULL) {
13569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "key must not be null.");
136d1945950451220932f70bac83408c761dcba231fMike Lockwood        goto error;
137d1945950451220932f70bac83408c761dcba231fMike Lockwood    }
138d1945950451220932f70bac83408c761dcba231fMike Lockwood
139d1945950451220932f70bac83408c761dcba231fMike Lockwood    key = env->GetStringUTFChars(keyJ, NULL);
140d1945950451220932f70bac83408c761dcba231fMike Lockwood
141d1945950451220932f70bac83408c761dcba231fMike Lockwood    len = property_get(key, buf, "");
142d1945950451220932f70bac83408c761dcba231fMike Lockwood    if (len == 1) {
143d1945950451220932f70bac83408c761dcba231fMike Lockwood        char ch = buf[0];
144d1945950451220932f70bac83408c761dcba231fMike Lockwood        if (ch == '0' || ch == 'n')
145d1945950451220932f70bac83408c761dcba231fMike Lockwood            result = false;
146d1945950451220932f70bac83408c761dcba231fMike Lockwood        else if (ch == '1' || ch == 'y')
147d1945950451220932f70bac83408c761dcba231fMike Lockwood            result = true;
148d1945950451220932f70bac83408c761dcba231fMike Lockwood    } else if (len > 1) {
149d1945950451220932f70bac83408c761dcba231fMike Lockwood         if (!strcmp(buf, "no") || !strcmp(buf, "false") || !strcmp(buf, "off")) {
150d1945950451220932f70bac83408c761dcba231fMike Lockwood            result = false;
151d1945950451220932f70bac83408c761dcba231fMike Lockwood        } else if (!strcmp(buf, "yes") || !strcmp(buf, "true") || !strcmp(buf, "on")) {
152d1945950451220932f70bac83408c761dcba231fMike Lockwood            result = true;
153d1945950451220932f70bac83408c761dcba231fMike Lockwood        }
154d1945950451220932f70bac83408c761dcba231fMike Lockwood    }
155d1945950451220932f70bac83408c761dcba231fMike Lockwood
156d1945950451220932f70bac83408c761dcba231fMike Lockwood    env->ReleaseStringUTFChars(keyJ, key);
157d1945950451220932f70bac83408c761dcba231fMike Lockwood
158d1945950451220932f70bac83408c761dcba231fMike Lockwooderror:
159d1945950451220932f70bac83408c761dcba231fMike Lockwood    return result;
160d1945950451220932f70bac83408c761dcba231fMike Lockwood}
161d1945950451220932f70bac83408c761dcba231fMike Lockwood
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void SystemProperties_set(JNIEnv *env, jobject clazz,
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                      jstring keyJ, jstring valJ)
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int err;
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* key;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* val;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (keyJ == NULL) {
17069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "key must not be null.");
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    key = env->GetStringUTFChars(keyJ, NULL);
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (valJ == NULL) {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        val = "";       /* NULL pointer not allowed here */
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        val = env->GetStringUTFChars(valJ, NULL);
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18006f367437c88f0960ea093c99388a16d0292121dBrad Fitzpatrick
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    err = property_set(key, val);
18206f367437c88f0960ea093c99388a16d0292121dBrad Fitzpatrick
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseStringUTFChars(keyJ, key);
18406f367437c88f0960ea093c99388a16d0292121dBrad Fitzpatrick
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (valJ != NULL) {
18606f367437c88f0960ea093c99388a16d0292121dBrad Fitzpatrick        env->ReleaseStringUTFChars(valJ, val);
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18806f367437c88f0960ea093c99388a16d0292121dBrad Fitzpatrick
18906f367437c88f0960ea093c99388a16d0292121dBrad Fitzpatrick    if (err < 0) {
19006f367437c88f0960ea093c99388a16d0292121dBrad Fitzpatrick        jniThrowException(env, "java/lang/RuntimeException",
19106f367437c88f0960ea093c99388a16d0292121dBrad Fitzpatrick                          "failed to set system property");
19206f367437c88f0960ea093c99388a16d0292121dBrad Fitzpatrick    }
19306f367437c88f0960ea093c99388a16d0292121dBrad Fitzpatrick}
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
195a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackbornstatic JavaVM* sVM = NULL;
196a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackbornstatic jclass sClazz = NULL;
197a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackbornstatic jmethodID sCallChangeCallbacks;
198a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn
199a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackbornstatic void do_report_sysprop_change() {
200a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn    //ALOGI("Java SystemProperties: VM=%p, Clazz=%p", sVM, sClazz);
201a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn    if (sVM != NULL && sClazz != NULL) {
202a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn        JNIEnv* env;
203a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn        if (sVM->GetEnv((void **)&env, JNI_VERSION_1_4) >= 0) {
204a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn            //ALOGI("Java SystemProperties: calling %p", sCallChangeCallbacks);
205a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn            env->CallStaticVoidMethod(sClazz, sCallChangeCallbacks);
206a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn        }
207a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn    }
208a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn}
209a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn
210a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackbornstatic void SystemProperties_add_change_callback(JNIEnv *env, jobject clazz)
211a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn{
212a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn    // This is called with the Java lock held.
213a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn    if (sVM == NULL) {
214a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn        env->GetJavaVM(&sVM);
215a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn    }
216a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn    if (sClazz == NULL) {
217a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn        sClazz = (jclass) env->NewGlobalRef(clazz);
218a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn        sCallChangeCallbacks = env->GetStaticMethodID(sClazz, "callChangeCallbacks", "()V");
219a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn        add_sysprop_change_callback(do_report_sysprop_change, -10000);
220a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn    }
221a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn}
222a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod method_table[] = {
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "native_get", "(Ljava/lang/String;)Ljava/lang/String;",
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      (void*) SystemProperties_getS },
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "native_get", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      (void*) SystemProperties_getSS },
228d1945950451220932f70bac83408c761dcba231fMike Lockwood    { "native_get_int", "(Ljava/lang/String;I)I",
229d1945950451220932f70bac83408c761dcba231fMike Lockwood      (void*) SystemProperties_get_int },
230d1945950451220932f70bac83408c761dcba231fMike Lockwood    { "native_get_long", "(Ljava/lang/String;J)J",
231d1945950451220932f70bac83408c761dcba231fMike Lockwood      (void*) SystemProperties_get_long },
232d1945950451220932f70bac83408c761dcba231fMike Lockwood    { "native_get_boolean", "(Ljava/lang/String;Z)Z",
233d1945950451220932f70bac83408c761dcba231fMike Lockwood      (void*) SystemProperties_get_boolean },
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "native_set", "(Ljava/lang/String;Ljava/lang/String;)V",
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      (void*) SystemProperties_set },
236a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn    { "native_add_change_callback", "()V",
237a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn      (void*) SystemProperties_add_change_callback },
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_os_SystemProperties(JNIEnv *env)
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return AndroidRuntime::registerNativeMethods(
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env, "android/os/SystemProperties",
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        method_table, NELEM(method_table));
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
248