sensor之libraries层(1)

本文详细介绍了C++中的JNI技术在Android SensorManager模块的应用。重点解析了JNI函数与Java层的映射关系,以及sensors_module_init等关键函数的工作原理。深入探讨了SensorManager的初始化过程和服务获取方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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保存起来。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值