Android Sensor (4) -- SystemSensorManageer和SensorService连接

 

 

@SystemSensorManager.java
public class SystemSensorManager extends SensorManager {
    @Override
    protected boolean registerListenerImpl(SensorEventListener listener, Sensor sensor,
            int delayUs, Handler handler, int maxBatchReportLatencyUs, int reservedFlags) {
        ...
            SensorEventQueue queue = mSensorListeners.get(listener);
            ...
            queue = new SensorEventQueue(listener, looper, this, fullClassName);   //SensorEventQueue
        }
    }


@frameworks/base/core/java/android/hardware/SystemSensorManager.java
    static final class SensorEventQueue extends BaseEventQueue {
    private static abstract class BaseEventQueue {

    BaseEventQueue(Looper looper, SystemSensorManager manager, int mode, String packageName) {
        if (packageName == null) packageName = "";
        nSensorEventQueue = nativeInitBaseEventQueue(manager.mNativeInstance,
                new WeakReference<>(this), looper.getQueue(),
                packageName, mode, manager.mContext.getOpPackageName());
        mCloseGuard.open("dispose");
        mManager = manager;
    }

 

@android_hardware_SensorManager.cpp
    {"nativeInitBaseEventQueue",
             "(JLjava/lang/ref/WeakReference;Landroid/os/MessageQueue;Ljava/lang/String;ILjava/lang/String;)J",
             (void*)nativeInitSensorEventQueue },


static jlong nativeInitSensorEventQueue(JNIEnv *env, jclass clazz, jlong sensorManager,
        jobject eventQWeak, jobject msgQ, jstring packageName, jint mode) {
    SensorManager* mgr = reinterpret_cast<SensorManager*>(sensorManager);
    ScopedUtfChars packageUtf(env, packageName);
    String8 clientName(packageUtf.c_str());
    sp<SensorEventQueue> queue(mgr->createEventQueue(clientName, mode));    //createEventQueue
    sp<Receiver> receiver = new Receiver(queue, messageQueue, eventQWeak);    //new Receiver fd 
    receiver->incStrong((void*)nativeInitSensorEventQueue);
    return jlong(receiver.get());
}

 

@android/frameworks/native/libs/sensor/SensorManager.cpp
sp<SensorEventQueue> SensorManager::createEventQueue(String8 packageName, int mode) {
    sp<SensorEventQueue> queue;

    Mutex::Autolock _l(mLock);
    while (assertStateLocked() == NO_ERROR) {
        sp<ISensorEventConnection> connection =
                mSensorServer->createSensorEventConnection(packageName, mode, mOpPackageName);
        if (connection == NULL) {
            // SensorService just died or the app doesn't have required permissions.
            ALOGE("createEventQueue: connection is NULL.");
            return NULL;
        }
        queue = new SensorEventQueue(connection);
        break;
    }
    return queue;
}
sp<ISensorEventConnection> SensorService::createSensorEventConnection(const String8& packageName,
        int requestedMode, const String16& opPackageName) {
    String16 connOpPackageName =
            (opPackageName == String16("")) ? String16(connPackageName) : opPackageName;
    sp<SensorEventConnection> result(new SensorEventConnection(this, uid, connPackageName,
            requestedMode == DATA_INJECTION, connOpPackageName));
    if (requestedMode == DATA_INJECTION) {
        result->updateLooperRegistration(mLooper);
    }
    return result;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值