深入浅出 - Android系统移植与平台开发(十三) - Sensor HAL框架分析之三

 

让我们来看看SensorManager的代码

SensorManager框架层代码

 

@frameworks/base/core/java/android/hardware/SensorManager.java

public SensorManager(Looper mainLooper) {
       mMainLooper = mainLooper;    // 上面说了,这是Activity的Looper

       synchronized(sListeners) {
            if(!sSensorModuleInitialized) {
                sSensorModuleInitialized = true;
                nativeClassInit();        // 好像是调用本地方法初始化
                  sWindowManager = IWindowManager.Stub.asInterface(
                       ServiceManager.getService("window"));  // 获得Windows服务,不管它
                  if (sWindowManager != null) {
                   // if it's null we're running in the system process
                   // which won't get the rotated values
                   try {
                       sRotation = sWindowManager.watchRotation(
                                newIRotationWatcher.Stub() {
                                    public voidonRotationChanged(int rotation) {
                                       SensorManager.this.onRotationChanged(rotation);
                                    }
                                }
                        );
                   } catch (RemoteException e) {
                   }
                }

               // initialize the sensor list
               sensors_module_init();         // 初始化sensor module
               final ArrayList<Sensor> fullList = sFullSensorsList;  // SensorManager维护的Sensor列表
                 int i = 0;
               do {
                   Sensor sensor = new Sensor(); // 创建sensor对象,这个是传递给App的哦
                   //调用module的方法,获得每一个sensor设备
                   i = sensors_module_get_next_sensor(sensor, i); 
                if (i>=0) {
                       //Log.d(TAG, "found sensor: " + sensor.getName() +
                       //        ", handle=" +sensor.getHandle());
                       sensor.setLegacyType(getLegacySensorType(sensor.getType()));
                       fullList.add(sensor); // 添加到SM维护的Sensor列表(嘿嘿)
                       sHandleToSensor.append(sensor.getHandle(), sensor);
                   }
                }while (i>0);

                sPool= new SensorEventPool( sFullSensorsList.size()*2 );
               sSensorThread = new SensorThread(); // 哟,创建线程了好像
            }
        }
    }

很明显nativeClassInit(),sensors_module_init(),sensors_module_get_next_sensor()都是本地实现的方法。

private static native void nativeClassInit();
private static native int sensors_module_init();
private static native intsensors_module_get_next_sensor(Sensor sensor, int next);

根据之前看代码的经验可知,很可能在frameworks/base/core/对应一个jni目录下的存在其对应的本地代码:

frameworks/base/core/java/android/hardware/SensorManager.java
frameworks/base/core/jni/android_hardware_SensorManager.cpp

果不其然,在jni存在其本地代码,让我们来看下nativeClassInit函数:

@frameworks/base/core/jni/android_hardware_SensorManager.cpp

static void
nativeClassInit (JNIEnv *_env, jclass _this)
{
   jclasssensorClass = _env->FindClass("android/hardware/Sensor");
   SensorOffsets& sensorOffsets = gSensorOffsets;
   sensorOffsets.name        =_env->GetFieldID(sensorClass, "mName",      "Ljava/lang/String;");
   sensorOffsets.vendor      =_env->GetFieldID(sen
  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值