Android学习笔记--service部分
http://w.hudong.com/e4d78ea6f05b4b4393c51bf3a31ddac8.html
代码路径:frameworks\base\services
分三个目录,java,jni,tests三个目录
jni目录下为用c实现的服务代码,所有的服务被编译成一个jni动态库,libandroid_servers.so
java目录下为android封装的java实现,通过jni(libandroid_servers.so )调用底层代码,并向上层应用提供服务。
关于JNI实现部分的说明,正好以services为例说明一下。
当jni库被load时,会自动调用JNI_OnLoad函数,通过该函数注册jni调用。
看jni\onload.cpp
#include"JNIHelp.h"
#include"jni.h"
#include"utils/Log.h"
#include"utils/misc.h"
namespaceandroid{ //这些函数在外部实现,为何如此?
intregister_android_server_AlarmManagerService(JNIEnv*env);
intregister_android_server_BatteryService(JNIEnv*env);
intregister_android_server_KeyInputQueue(JNIEnv*env);
intregister_android_server_LightsService(JNIEnv*env);
intregister_android_server_SensorService(JNIEnv*env);
intregister_android_server_VibratorService(JNIEnv*env);
intregister_android_server_SystemServer(JNIEnv*env);
};
usingnamespaceandroid;
extern"C"jintJNI_OnLoad(JavaVM*vm,void*reserved) // 为何extern"C"?
{
JNIEnv*env=NULL;
jintresult=-1;
if(vm->GetEnv((void**)&env,JNI_VERSION_1_4)!=JNI_OK){
LOGE("GetEnvfailed!");
returnresult;
}
LOG_ASSERT(env,"Couldnotretrievetheenv!");
register_android_server_KeyInputQueue(env);
register_android_server_LightsService(env);
register_android_server_AlarmManagerService(env);
register_android_server_BatteryService(env);
register_android_server_SensorService(env);
register_android_server_VibratorService(env);
register_android_server_SystemServer(env);
returnJNI_VERSION_1_4;
}
注意每个注册函数的实现,
staticJNINativeMethodsMethods[]={
/*name,signature,funcPtr*/
{"native_update","()V",(void*)android_server_BatteryService_update},
};
intregister_android_server_BatteryService(JNIEnv*env)
{
。。。
returnjniRegisterNativeMethods(env,"com/android/server/BatteryService",sMethods,NELEM(sMethods));
}
之所以不一次注册,而分为多次,原因在于,java是面向对象的,当本地实现的函数分属于不同的java对象时,就需要长对不同对象的本地函数分别注册。
其实底层的代码都不是面向对象的,为何jni中都是.cpp实现?
//SystemServer.java
publicclassSystemServer
{
privatestaticfinalStringTAG="SystemServer";
publicstaticfinalintFACTORY_TEST_OFF=0;
publicstaticfinalintFACTORY_TEST_LOW_LEVEL=1;
publicstaticfinalintFACTORY_TEST_HIGH_LEVEL=2;
staticTimertimer;
staticfinallongSNAPSHOT_INTERVAL=60*60*1000;//1hr
/**
*ThismethodiscalledfromZygotetoinitializethesystem.Thiswillcausethenative
*services(SurfaceFlinger,AudioFlinger,etc..)tobestarted.Afterthatitwillcallback
*upintoinit2()tostarttheAndroidservices.
*/
nativepublicstaticvoidinit1(String[]args);
publicstaticvoidmain(String[]args){
if(SamplingProfilerIntegration.isEnabled()){
SamplingProfilerIntegration.start();
timer=newTimer();
timer.schedule(newTimerTask(){
@Override
publicvoidrun(){
SamplingProfilerIntegration.writeSnapshot("system_server");
}
},SNAPSHOT_INTERVAL,SNAPSHOT_INTERVAL);
}
//Thesystemserverhastorunallofthetime,soitneedstobe
//asefficientaspossiblewithitsmemoryusage.
VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
System.loadLibrary("android_servers");
init1(args);
}
publicstaticfinalvoidinit2(){
Slog.i(TAG,"EnteredtheAndroidsystemserver!");
Threadthr=newServerThread();
thr.setName("android.server.ServerThread");
thr.start();
}
}
更多相关文章
- 使用泛型方法在Java中安全地进行强制类型转换
- HockeyApp环境搭建
- Android数据通信开发与应用(四):实战开发
- android监控SIM卡状态的广播示例代码
- Android(安卓)studio如何使用SVN进行版本控制?
- android Toast大全(五种情形)
- AndroidUI-TxetView嵌套Html的使用
- 在代码中实现按下Home键的效果
- Android开发之广播机制