sensor之libraries层(1)

C++中的JNI

    相关文件:/frameworks/base/core/jni/android_hardware_SensorManager.cpp;


Java和C++的函数对应关系

本层及以下的所有相关代码都是为了实现这几个函数。

static JNINativeMethod gMethods[] = {
    {"nativeClassInit", "()V",              (void*)nativeClassInit },
    {"sensors_module_init","()I",           (void*)sensors_module_init },
    {"sensors_module_get_next_sensor","(Landroid/hardware/Sensor;I)I",
                                            (void*)sensors_module_get_next_sensor },

    {"sensors_create_queue",  "()I",        (void*)sensors_create_queue },
    {"sensors_destroy_queue", "(I)V",       (void*)sensors_destroy_queue },
    {"sensors_enable_sensor", "(ILjava/lang/String;II)Z",
                                            (void*)sensors_enable_sensor },

    {"sensors_data_poll",  "(I[F[I[J)I",     (void*)sensors_data_poll },
};

nativeClassInit很简单,就是为了初始化gSensorOffsets。

 sensors_module_init()模块初始化-->hw_get_module()-->load(),其实就是把sensor.so的链接库加载进来;

    sensor.so是与机器相关的hardware层来实现的,要在hardware下实现相应的sensor.cpp;这个文件就是跟kernel打交道的最底层的文件了。里面主要完成了打开设备文件,读取设备节点的数据。比如我们的Gsensor是走的输入输出子系统,就打开相应的event文件来读取驱动上报的坐标数据。

ANDROID_SINGLETON_STATIC_INSTANCE(SensorManager)

static jint
sensors_module_init(JNIEnv *env, jclass clazz)
{
    SensorManager::getInstance();
    return 0;
}
估计你怎么也找不到SensorManager::getInstance,但是在SensorManager.cpp里你能找的这么一句:ANDROID_SINGLETON_STATIC_INSTANCE(SensorManager),ANDROID_SINGLETON_STATIC_INSTANCE是一个宏,定义在Singleton.h文件中。
#define ANDROID_SINGLETON_STATIC_INSTANCE(TYPE)                 \
    template class Singleton< TYPE >;                           \
    template<> Mutex Singleton< TYPE >::sLock(Mutex::PRIVATE);  \
    template<> TYPE* Singleton< TYPE >::sInstance(0);

Singleton是一个模板类,定义也在Singleton.h中

template <typename TYPE>
class Singleton
{
public:
    static TYPE& getInstance() {
        Mutex::Autolock _l(sLock);
        TYPE* instance = sInstance;
        if (instance == 0) {
            instance = new TYPE();
            sInstance = instance;
        }
        return *instance;
    }
    
protected:
    ~Singleton() { };
    Singleton() { };

private:
    Singleton(const Singleton&);
    Singleton& operator = (const Singleton&);
    static Mutex sLock;
    static TYPE* sInstance;
};

这又是一个典型的单例模式获得类的对象,但是要注意这儿的SensorManager是本地的类,而不是Java层的SensorManager类。其实就是看看有没有初始化SensorManager类,没有的话new一个出来。下面我们就看一下SensorManager的构造函数。

SensorManager::SensorManager()
    : mSensorList(0)
{
    const String16 name("sensorservice");
    while (getService(name, &mSensorServer) != NO_ERROR) {
        usleep(250000);
    }

    mSensors = mSensorServer->getSensorList();
    size_t count = mSensors.size();
    mSensorList = (Sensor const**)malloc(count * sizeof(Sensor*));
    for (size_t i=0 ; i<count ; i++) {
        mSensorList[i] = mSensors.array() + i;
    }
}

获取sensorservice服务,然后调用服务的getSensorList,最后将获取的传感器列表用mSensorList保存起来。




你可能感兴趣的:(sensor之libraries层(1))