C++ 类模板在Android Camera代码里的一个例子

对上文[转]C++ 类模板和模板类的一点小补充。

以kk系统上Camera相关代码举例,位置:

frameworks/av/include/camera/CameraBase.h
frameworks/av/include/camera/Camera.h

frameworks/av/camera/CameraBase.cpp
frameworks/av/camera/Camera.cpp

在CameraBase中提供了一些模板:

// CameraBase.h
template <typename TCam, typename TCamTraits = CameraTraits<TCam> >
class CameraBase : public IBinder::DeathRecipient
{
public:
    typedef typename TCamTraits::TCamListener       TCamListener;
    typedef typename TCamTraits::TCamUser           TCamUser;
    typedef typename TCamTraits::TCamCallbacks      TCamCallbacks;
    typedef typename TCamTraits::TCamConnectService TCamConnectService;

    static sp<TCam>      connect(int cameraId,
                                 const String16& clientPackageName,
                                 int clientUid);
    ...
protected:
    typedef CameraBase<TCam>         CameraBaseT;
    ...
}

// CameraBase.cpp
template <typename TCam, typename TCamTraits>
sp<TCam> CameraBase<TCam, TCamTraits>::connect(int cameraId,
                                               const String16& clientPackageName,
                                               int clientUid)
{
    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);
    }
    ...
}

Camera代码中使用了CameraBase

// Camera.h
class Camera :
    public CameraBase<Camera>,
    public BnCameraClient
{
        ...
}

struct CameraTraits<Camera>
{
    typedef CameraListener        TCamListener;
    typedef ICamera               TCamUser;
    typedef ICameraClient         TCamCallbacks;
    typedef status_t (ICameraService::*TCamConnectService)(const sp<ICameraClient>&,
                                                           int, const String16&, int,
                                                           /*out*/
                                                           sp<ICamera>&);
    static TCamConnectService     fnConnectService;
};

// Camera.cpp
CameraTraits<Camera>::TCamConnectService CameraTraits<Camera>::fnConnectService =
        &ICameraService::connect;


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

对照一下,CameraBase.h中TCamCameraTCamTraitsCamera.h定义的CameraTraits<Camera>,可得到CameraBase.h对应的结果

// CameraBase.h
class CameraBase : public IBinder::DeathRecipient
{
public:
    typedef typename CameraListener       TCamListener;
    typedef typename ICamera           TCamUser;
    typedef typename ICameraClient      TCamCallbacks;
    typedef typename CameraTraits<Camera>::TCamConnectService TCamConnectService;

    static sp<Camera>      connect(int cameraId,
                                 const String16& clientPackageName,
                                 int clientUid);
    ...
protected:
    typedef CameraBase<Camera>         CameraBaseT;
    ...
}

同理

// CameraBase.cpp
sp<TCam> CameraBase<Camera, CameraTraits<Camera>>::connect(int cameraId,
                                               const String16& clientPackageName,
                                               int clientUid)
{
    sp<Camera> c = new TCam(cameraId);
    sp<ICameraClient> cl = c;
    status_t status = NO_ERROR;
    const sp<ICameraService>& cs = getCameraService(); //返回BpCameraService

    if (cs != 0) {
        CameraTraits<Camera>::TCamConnectService fnConnectService = &ICameraService::connect;
        status = (cs.get()->*&ICameraService::connect)(cl, cameraId, clientPackageName, clientUid,
                                             /*out*/ c->mCamera); //调用BpCameraService的connect方法
    }
    ...
}

猜你喜欢

转载自blog.csdn.net/QWE123ZXCZ/article/details/84553853