1515** limitations under the License.
1616*/
1717
18+ #define LOG_TAG " SysPropJNI"
19+
1820#include " cutils/properties.h"
21+ #include " utils/misc.h"
22+ #include < utils/Log.h>
1923#include " jni.h"
2024#include " android_runtime/AndroidRuntime.h"
2125#include < nativehelper/JNIHelp.h>
@@ -188,6 +192,34 @@ static void SystemProperties_set(JNIEnv *env, jobject clazz,
188192 }
189193}
190194
195+ static JavaVM* sVM = NULL ;
196+ static jclass sClazz = NULL ;
197+ static jmethodID sCallChangeCallbacks ;
198+
199+ static void do_report_sysprop_change () {
200+ // ALOGI("Java SystemProperties: VM=%p, Clazz=%p", sVM, sClazz);
201+ if (sVM != NULL && sClazz != NULL ) {
202+ JNIEnv* env;
203+ if (sVM ->GetEnv ((void **)&env, JNI_VERSION_1_4) >= 0 ) {
204+ // ALOGI("Java SystemProperties: calling %p", sCallChangeCallbacks);
205+ env->CallStaticVoidMethod (sClazz , sCallChangeCallbacks );
206+ }
207+ }
208+ }
209+
210+ static void SystemProperties_add_change_callback (JNIEnv *env, jobject clazz)
211+ {
212+ // This is called with the Java lock held.
213+ if (sVM == NULL ) {
214+ env->GetJavaVM (&sVM );
215+ }
216+ if (sClazz == NULL ) {
217+ sClazz = (jclass) env->NewGlobalRef (clazz);
218+ sCallChangeCallbacks = env->GetStaticMethodID (sClazz , " callChangeCallbacks" , " ()V" );
219+ add_sysprop_change_callback (do_report_sysprop_change, -10000 );
220+ }
221+ }
222+
191223static JNINativeMethod method_table[] = {
192224 { " native_get" , " (Ljava/lang/String;)Ljava/lang/String;" ,
193225 (void *) SystemProperties_getS },
@@ -201,6 +233,8 @@ static JNINativeMethod method_table[] = {
201233 (void *) SystemProperties_get_boolean },
202234 { " native_set" , " (Ljava/lang/String;Ljava/lang/String;)V" ,
203235 (void *) SystemProperties_set },
236+ { " native_add_change_callback" , " ()V" ,
237+ (void *) SystemProperties_add_change_callback },
204238};
205239
206240int register_android_os_SystemProperties (JNIEnv *env)
0 commit comments