zoukankan      html  css  js  c++  java
  • Android Lights

    Android Lights

     

    很多Android手机上都配有LED灯,手机在充电、新来短信等时候都会有相应的指示灯提示。

    Android系统之中,一共定义了8个逻辑灯,包含:背光,键盘灯,按键灯,充电指示灯,通知提示等。

      

    图表 A  Android中的提示灯

    其中,定义了系统中所有可能用到的Light。

    Jni与Native:

    与Lights相关的JNI代码在目录:frameworks/base/services/jni下,

    So库的加载:

    编译:Frameworks/base/services/jni/Android.mk中:

     

    图表 B lights相关库文件的编译

    生成动态库:libandroid_servers.so。

    Java中加载so库时,系统调用方法:

    Extern “C” jint JNI_OnLoad(JavaVM* vm, void* reserved) {

             ……

             Register_android_server_LightsService(env);

             ……

    }

    来完成jni中相关函数的注册过程。

     

    图表 C  JNI中相关函数的注册

    至此,已经通过jni建立了java与native函数的映射关系。在java代码中,可以通过调用相关函数来完成相应的功能了。

    三个函数:

    Jni中,通过JNI方式提供给java层调用的函数有三个:

    Static JNINativeMethod mothod_table[] = {

             { “init_native”, “()I”, (void*)init_native, },

             { “finalize_native”, “(I)V”, (void*)finalize_native, },

             { “setLight_native”, “(IIIIIII)V”, (void*)setLight_native, },

    };

    • Static         jint init_native(JNIEnv *env, jobject clazz)

    {

    //通过hw_get_module方法查到到注册为LIGHTS_HARDWARE_MODULE_ID,即:”lights”的module模块。

    err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);

    if (err == 0)

    {

             Devices->lights[LIGHT_INDEX_BACKLIGHT] = get_device(module, LIGHT_ID_BACKLIGHT);

             Devices->lights[LIGHT_INDEX_KEYBOARD] = get_device(module, LIGHT_INDEX_KEYBOARD);

             ……

    }

    }

    • Static void finalize_native(JNIEnv *env, jobject clazz, int ptr)

    {

    If (devices == NULL)

    {

               Return;

    }

    Free(devices);

    }

    • Static void setLight_native(JNIEnv *env, jobject clazz, int ptr, int light, int colorARGB, int flashMode, int onMS, int offMS, int brightnessMode)

    {

    Memset(&state, 0, sizeof(light_state_t));

    State.color = colorARGB;

    State.flashMode = flashMode;

     State.flashOnMS = onMS;

     State.flashOffMS = offMS;

     State.brightnessMode = brightnessMode;

    ……

     Devices->lights[light]->setlight(devices->lights[light], &state);

    }

    Java Framework:

    关于Light的系统服务:

     services/java/com/android/server/LightsService.java

     

    图表 D  Frameworks中的LightsService

    其中,有个很重要的内部类 Light,表示某种具体类型的指示灯,类图如下:

     

    图表 E  Frameworks中的Light类图

    类中,最重要的一个方法:

    Private void setLightLocked(int color, int mode, int onMS, int offMS, int brightnessMode)

    {

    mColor = color;

    mMode = mode;

    mOnMS = onMS;

    mOffMS = offMS;
    // 最后,通过调用native方法来完成函数功能

    setLight_native(mNativePointer, mId, color, mode, onMS, offMS, brightnessMode);

    }

    二、      如何应用:

    对于控制lights的服务——LightsService.java,android框架层没有提供直接的调用该类中相关功能函数的接口,所以应用程序无法通过直接调用API来控制指示灯的显示。

    这里可以参考BatteryService类中对3-Color Light的使用方式:

     

    1. 获取特定的Light:

    mBatteryLight = lights.getLight(LightService.LIGHT_ID_BATTERY);

    1. 根据需求,在不同的状态下,调用相关函数完成指示灯的功能:

    mBatteryLight.setColor();

    mBatteryLight.setFlashing();

  • 相关阅读:
    Socket的使用
    TCP/IP协议、UDP协议、 Http协议
    使用或不使用递归的二分查找
    冒泡排序、选择排序、直接插入排序
    Scanner的使用 猜数字 +猜电影
    序列化与反序列化
    构造者模式
    内存访问
    实践:使用socket实现跨进程通信(二:多并发)(C语言)
    实践:使用socket实现跨进程通信(C语言)
  • 原文地址:https://www.cnblogs.com/caidi/p/3461871.html
Copyright © 2011-2022 走看看