1、Android 驱动 = linux驱动 + 封装

1、Android 驱动 = linux驱动 + 封装

1、(JNI访问)Java –> C库
app –>c库

2、硬件访问服务

通过硬件服务
| + JNI
硬件服务

这里写图片描述

这里写图片描述

硬件访问服务:
1、loadLibrary 加载C库

2、JNI_Onload:注册本地方法
(分别调用各个硬件的函数来注册本地方法)
{ LED
{ 振动器
{ 串口

3、SystemServer:对每个硬件
{构造Service(使用本地方法)
{addService

Server–>Service(服务器提供服务)

4、APP怎么使用{获得服务:getService
{使用服务:执行service方法

/**
 * The main entry point from zygote.
 */
public static void main(String[] args) {
    new SystemServer().run();
}

加载C库

private void run() {

    // Initialize native services.
   System.loadLibrary("android_servers");

}

调用到onload.cpp

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

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

    register_android_server_PowerManagerService(env);

    return JNI_VERSION_1_4;
}

函数名+com前缀
com_android_server_SerialService.cpp(JNI文件)
完全可以在这个里面实现硬件操作的实现。

int register_android_server_VibratorService(JNIEnv *env)
{
    //注册本地方法
    return jniRegisterNativeMethods(env, "com/android/server/VibratorService",
            method_table, NELEM(method_table));
}

硬件操作过于复杂:
单独写在HAL文件
{1、容易修改
{2、出于保密

猜你喜欢

转载自blog.csdn.net/qq_33487044/article/details/80888793