让我们来看看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