TCam 到底是如何被替换成Camera的?

本文详细解析了C++中Camera类如何通过继承和模板实现在CameraBase和TCam之间的传递,展示了Camera的连接过程和类间的协作。重点在于理解CameraBase<TCam>的运用和CameraBase类的实现细节。
摘要由CSDN通过智能技术生成

首先看Camera.cpp中的地方

sp<Camera> Camera::connect(int cameraId, const String16& clientPackageName,
        int clientUid)
{
    return CameraBaseT::connect(cameraId, clientPackageName, clientUid);
}

sp中的Camera 传递到下面Camera.h文件中CameraBase中的Camera

然后再看Camera.h文件中如下定义


class Camera :
    public CameraBase<Camera>,
    public BnCameraClient

  。。。

CameraBase 中的Camera继续往下传递到CamerBase.h中的TCam

再来到CamerBase.h

template <typename TCam, typename TCamTraits = CameraTraits<TCam> >
class CameraBase : public IBinder::DeathRecipient

。。。

typedef CameraBase<TCam>         CameraBaseT;

看到了吧 

CameraBase<TCam>         CameraBaseT翻译过来就是

CameraBase<Camera>         CameraBaseT

然后再回头看

CameraBaseT::connect(cameraId, clientPackageName, clientUid);

来到

CameraBase.cpp 中,下面的TCam都替换成Camera

template <typename TCam, typename TCamTraits>
sp<TCam> CameraBase<TCam, TCamTraits>::connect(int cameraId,
                                               const String16& clientPackageName,
                                               int clientUid)
{
    ALOGV("%s: connect", __FUNCTION__);
    sp<TCam> c = new TCam(cameraId);
    sp<TCamCallbacks> cl = c;
    status_t status = NO_ERROR;
    const sp<ICameraService>& cs = getCameraService();

    if (cs != 0) {
        TCamConnectService fnConnectService = TCamTraits::fnConnectService;
        status = (cs.get()->*fnConnectService)(cl, cameraId, clientPackageName, clientUid,
                                             /*out*/ c->mCamera);
    }
    if (status == OK && c->mCamera != 0) {
        IInterface::asBinder(c->mCamera)->linkToDeath(c);
        c->mStatus = NO_ERROR;
    } else {
        ALOGW("An error occurred while connecting to camera: %d", cameraId);
        c.clear();
    }
    return c;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liujun3512159

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值