SystemService.java:(调库、启动服务)
1.System.loadLibbrary("android_servers");
libandroid_servers.so依赖jni文件夹下所有的com_android_server_xxx Service.cpp文件和onload.cpp文件。
System.loadLibbrary()函数会调用JNI_OnLoad()函数。JNI_OnLoad()函数在onload.cpp.
2.Slog.i(TAG,"xxx Service")。
3.xxx = new xxxService(context)。
4.ServiceManager.addService(“xxx”,xxx)。
onload.cpp:(实现native方法、获得env、找类)
1.JNI_OnLoad(Java* vm, void* /* reserver */)
获得env,vm->GetEnv((void**) &env, JNI_VERSION_1_4) 。
找类, JNI_OnLoad()函数调用一系列register_android_server_XXXService(env)函数,进行找类。
Com_android_server_XXXService.cpp:(为onload.cpp提供register_android_server_XXXService()
1.register_android_server_XXXService(env)函数进行找类。
jniRegisterNativeMethods(env, "com/android/server/xxxService",method_table, NELEM(method_table))
2.JNINativeMethod methods[],自定义native修饰的 java_ioctl函数对应的 c_ioctl方法。
com/android/server/xxxService.java:
1.实现xxxService类。
native static int java_ioctl(int which,int status)。声明native方法。
实现IHelloService.aidl生成IHelloService.java的生成binder机制的接口led_ioctl。
hal.c:(硬件抽象层)
1.自定义一个led_device_t结构体。
第一个成员为struct hw_device_t comm结构体实例。
2.定义一个struct led_device_t led_device实例。
填充.hal_ioctl = led_hal_ioctl。
3.int led_open(const struct hw_module_t* module,const char* id,struct hw_device_t device)。**
4.struct hw_module_methods_t method。
5.struct hw_module_t HMI。
led_driver.c:(内核层驱动)
1.static struct file_operations fops。
2.static void __init。
3.static void __exit。
IHelloService.aidl:
1.package android.os。
2.interface xxxService。
int led_ioctl(int which,int status)。
3.在androidM/frameworks/base/Android.mk加一行
core/java/android/os/IHelloService.aidl \
IHelloService.java:
2.生成binder机制的接口。
public int led_ioctl(int which ,int status) throws android.os.RemoteException。
APP:
1.ServiceManager.getservice()。