Android学习笔记--service部分

来源:互联网 发布:45型驱逐舰对比055知乎 编辑:程序博客网 时间:2024/05/17 21:45


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"

namespace android {                                       //这些函数在外部实现,为何如此?

int register_android_server_AlarmManagerService(JNIEnv* env);
int register_android_server_BatteryService(JNIEnv* env);
int register_android_server_KeyInputQueue(JNIEnv* env);
int register_android_server_LightsService(JNIEnv* env);
int register_android_server_SensorService(JNIEnv* env);
int register_android_server_VibratorService(JNIEnv* env);
int register_android_server_SystemServer(JNIEnv* env);
};
using namespace android;

extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved)     // 为何extern "C"?
{
    JNIEnv* env = NULL;
    jint result = -1;

    if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
        LOGE("GetEnv failed!");
        return result;
    }
    LOG_ASSERT(env, "Could not retrieve the env!");

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

    return JNI_VERSION_1_4;
}

注意每个注册函数的实现,
static JNINativeMethod sMethods[] = {
     /* name, signature, funcPtr */
{"native_update", "()V", (void*)android_server_BatteryService_update},
};

 

int register_android_server_BatteryService(JNIEnv* env)
{

。。。

    return jniRegisterNativeMethods(env, "com/android/server/BatteryService", sMethods, NELEM(sMethods));
}

之所以不一次注册,而分为多次,原因在于,java是面向对象的,当本地实现的函数分属于不同的java对象时,就需要长对不同对象的本地函数分别注册。

 

 

其实底层的代码都不是面向对象的,为何jni中都是.cpp实现?

 

 

//SystemServer.java

public class SystemServer
{
    private static final String TAG = "SystemServer";

    public static final int FACTORY_TEST_OFF = 0;
    public static final int FACTORY_TEST_LOW_LEVEL = 1;
    public static final int FACTORY_TEST_HIGH_LEVEL = 2;

    static Timer timer;
    static final long SNAPSHOT_INTERVAL = 60 * 60 * 1000; // 1hr

    /**
     * This method is called from Zygote to initialize the system. This will cause the native
     * services (SurfaceFlinger, AudioFlinger, etc..) to be started. After that it will call back
     * up into init2() to start the Android services.
     */
    native public static void init1(String[] args);

    public static void main(String[] args) {
        if (SamplingProfilerIntegration.isEnabled()) {
            SamplingProfilerIntegration.start();
            timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    SamplingProfilerIntegration.writeSnapshot("system_server");
                }
            }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);
        }

        // The system server has to run all of the time, so it needs to be
        // as efficient as possible with its memory usage.
        VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
        
        System.loadLibrary("android_servers");
        init1(args);
    }

    public static final void init2() {
        Slog.i(TAG, "Entered the Android system server!");
        Thread thr = new ServerThread();
        thr.setName("android.server.ServerThread");
        thr.start();
    }
}


原创粉丝点击