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();
}
}


更多相关文章

  1. 使用泛型方法在Java中安全地进行强制类型转换
  2. HockeyApp环境搭建
  3. Android数据通信开发与应用(四):实战开发
  4. android监控SIM卡状态的广播示例代码
  5. Android(安卓)studio如何使用SVN进行版本控制?
  6. android Toast大全(五种情形)
  7. AndroidUI-TxetView嵌套Html的使用
  8. 在代码中实现按下Home键的效果
  9. Android开发之广播机制

随机推荐

  1. Android之使用微信开放api (一)
  2. Android(安卓)混淆 (不定期完善第三方混
  3. Android锁屏与解锁广播状态监听
  4. GIT开源安卓项目Top100
  5. [置顶] 实现android应用程序自动打包(Ant+
  6. getApplicationContext()、getBaseContex
  7. android 多线程下载 显示进度 速度
  8. Android(安卓)使用ExoPlayer视频播放 (二)
  9. Anroid Framework启动过程(android内核剖
  10. android fragment与activity接口传值