当前位置:操作系统 > 安卓/Android >>

Android模拟器学framework和driver之传感器篇5(Android framework---JNI)

之前的几篇文章重点介绍了android中传感器模块的标准移植方法,这篇文章我主要跟大家介绍下android framework中对传感器的处理以及管理,涉及到的代码有:
 
/frameworks/base/services/sensorservice/SensorService.cpp
 
 
/frameworks/base/services/sensorservice/SensorDevice.cpp
 
/frameworks/base/services/sensorservice/SensorInte易做图ce.cpp
 
 
/frameworks/base/core/jni/android/hardware/jni/android_hardware_SensorManager.cpp
 
/frameworks/base/core/java/android/hardware/SensorManager.java
 
首先在这里我先声明下,网上关于这部分的资料很多,不过都大同小异,而且大部分是android2.2的分析,但是到了2.3之后sensor这边改了很多代码,一开始我也看的很迷糊的。这里我只是阐述了我的理解,可能是有问题的,希望有识之士可以指出,这边我也只能粗略的介绍了,能力有限。
 
在上一篇文章中介绍了在SensorDevice.cpp中使用hw_get_module来获得HAL层编译出来的sensor.goldfish.so:
 
 
SensorDevice::SensorDevice() 
    :  mSensorDevice(0), 
       mSensorModule(0) 
{  
    status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID, 
            (hw_module_t const**)&mSensorModule); 
 
    LOGE_IF(err, "couldn't load %s module (%s)", 
            SENSORS_HARDWARE_MODULE_ID, strerror(-err)); 
 
    if (mSensorModule) { 
        err = sensors_open(&mSensorModule->common, &mSensorDevice); 
 
        LOGE_IF(err, "couldn't open device for module %s (%s)", 
                SENSORS_HARDWARE_MODULE_ID, strerror(-err)); 
 
        if (mSensorDevice) { 
            sensor_t const* list; 
            ssize_t count = mSensorModule->get_sensors_list(mSensorModule, &list); 
            mActivationCount.setCapacity(count); 
            Info model; 
            for (size_t i=0 ; i<size_t(count) ; i++) { 
                mActivationCount.add(list[i].handle, model); 
                mSensorDevice->activate(mSensorDevice, list[i].handle, 0); 
            } 
        } 
    } 

SensorDevice::SensorDevice()
    :  mSensorDevice(0),
       mSensorModule(0)
{
    status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID,
            (hw_module_t const**)&mSensorModule);
 
    LOGE_IF(err, "couldn't load %s module (%s)",
            SENSORS_HARDWARE_MODULE_ID, strerror(-err));
 
    if (mSensorModule) {
        err = sensors_open(&mSensorModule->common, &mSensorDevice);
 
        LOGE_IF(err, "couldn't open device for module %s (%s)",
                SENSORS_HARDWARE_MODULE_ID, strerror(-err));
 
        if (mSensorDevice) {
            sensor_t const* list;
            ssize_t count = mSensorModule->get_sensors_list(mSensorModule, &list);
            mActivationCount.setCapacity(count);
            Info model;
            for (size_t i=0 ; i<size_t(count) ; i++) {
                mActivationCount.add(list[i].handle, model);
                mSensorDevice->activate(mSensorDevice, list[i].handle, 0);
            }
        }
    }
}
 
 
 
这就是framework调用到HAL的最最重要的一个接口,接下来的工作可以说就是根据得到的这个地址来找到相应的HAL中定义的hw_device_t结构体中的回调函数作为framework中的api,然后进行“封装”,因为hal中只是poll数据,framework需要对数据处理,以及封装API给android app开发者使用。
 
 
/** Open a new instance of a sensor device using name */ 
static int open_sensors(const struct hw_module_t* module, const char* id, 
                        struct hw_device_t** device) 

        int status = -EINVAL; 
     
        sensors_poll_context_t *dev = new sensors_poll_context_t(); 
 
        memset(&dev->device, 0, sizeof(sensors_poll_device_t)); 
 
        dev->device.common.tag = HARDWARE_DEVICE_TAG; 
        dev->device.common.version  = 0; 
        dev->device.common.module   = const_cast<hw_module_t*>(module); 
        dev->device.common.close    = poll__close; 
        dev->device.activate        = poll__activate; 
        dev->device.setDelay        = poll__setDelay; 
        dev->device.poll            = poll__poll; 
 
        *device = &dev->device.common; 
        status = 0; 
        return status; 

/** Open a new instance of a sensor device using name */
static int open_sensors(const struct hw_module_t* module, const char* id,
                        struct hw_device_t** device)
{
        int status =
补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,