首先看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;
}