Written by
im jin hyeon
on
on
기본카메라앱 생성의 흐름
카메라생성흐름
//프레임워크 경로를 확인해 대충 어떤쪽 명령인지 감잡기..
//sp
카메라생성, SurfaceCreated 주요함수호출의 흐름 , 함수들의 대략적기능
surfaceCreated
[
camera = Camera.open(); /frameworks/base/core/java/android/hardware/Camera.java
[
return new Camera(i); /frameworks/base/core/java/android/hardware/Camera.java
[ @객체생성
native_setup(new WeakReference<Camera>(this), cameraId, packageName); /frameworks/base/core/jni/android_hardware_Camera.cpp JNI통해 native코드로 보냄
[ @JNI로 네이티브코드로 연결
sp<Camera> camera = Camera::connect(cameraId, clientName,Camera::USE_CALLING_UID); /frameworks/av/camera/Camera.cpp
[ @ Connect의 return값주소를 Camera 포인터와 연결
return CameraBaseT::connect(cameraId, clientPackageName, clientUid); /frameworks/av/camera/CameraBase.cpp
[ @멤버 BaseT 내부함수 connect 호출
sp<TCam> c = new TCam(cameraId); *Camera(int cameraId)* /frameworks/av/camera/Camera.cpp
[ @카메라객체 생성
Camera::Camera(int cameraId):CameraBase(cameraId) /frameworks/av/camera/Camera.cpp
[
CameraBase(int cameraId); /frameworks/av/camera/CameraBase.cpp
[ @초기화
CameraBase<TCam, TCamTraits> ::CameraBase(int cameraId):
[
mStatus(UNKNOWN_ERROR),
mCameraId(cameraId)
]
] CameraBase<TCam, TCamTraits> ::CameraBase(int cameraId): 초기화 완료
]20 Camera::Camera(int cameraId): CameraBase(cameraId)로 정의된 Camera객체 생성완료
]19, c = new TCam(cameraId) 포인터연결 Tcam포인터
sp<TCamCallbacks> cl = c; ////typedef ICameraClient(클래스?) TCamCallbacks;
@cl=Icameraclient포인터 카메라객체 주소값저장?
const sp<ICameraService>& cs = getCameraService(); /////const sp<ICameraService>& CameraBase<TCam, TCamTraits>::getCameraService()
[ @멤버ICameraClient 에 service를 가져옴
binder = sm->getService(String16(kCameraServiceName));
binder->linkToDeath(gDeathNotifier);
gCameraService = interface_cast<ICameraService>(binder);
return gCameraService;
] @binder과정
TCamConnectService fnConnectService = TCamTraits::fnConnectService;
[
typedef로 정의된 함수 포인터 선언하고 함수를 저장
CameraTraits<Camera>::
TCamConnectService CameraTraits<Camera>::fnConnectService
=&ICameraService::connect;
]
status = (cs.get()->*fnConnectService) (cl, cameraId, clientPackageName, clientUid,/*out*/ c->mCamera); //cs=카메라
[
sp<T> get() 자기주소=카메라객체주소
cs의 fnconnectservice에 접근 (&ICameraService::connect;) 접근
ICameraService = BpCameraService이므로,
BpCameraService::connect //코드수행::connect to camera service (android.hardware.Camera)
(virtual status_t connect
[ @카메라 서비스연결,, 이해안되는부분
[
remote()->transact(BnCameraService::CONNECT, data, &reply);
status_t BnCameraService::onTransact
[
status_t status = connect // 마치 connect() 함수가 이전에 실행했던 BpCameraService 클래스의 connect() 함수를 실행하는 듯한 모습 하지만 Native 프로세스의 CameraService 내의 connect() 함수가 실행
(cameraClient, cameraId, clientName, clientUid, /*out*/ camera);
@status_t CameraService::connect
[
sp<Client> client;
[
client = new CameraClient(this, cameraClient, clientPackageName, cameraId, facing, callingPid, clientUid, getpid())
]
]
]
return status
]
]
]
]17,CameraBaseT::connect
]14,sp<Camera> camera = Camera::connect
context->incStrong((void*)android_hardware_Camera_native_setup); //선언된 JNICameraContext 변수값 >>> camera 클래스 변수 Listerner에 넣음
camera->setListener(context);
[ @listener연결
Mutex::Autolock _l(mLock);
mListener = listener;
]
]13,native_setup
]11,return new Camera(i);
]9. Camera.open();
]6. surfaceCreated 완료
///
CameraBaseT : CameraBase
camehabase.h정의 , camera객체의 멤버로존재?
Tcam = Camera Type??
sp
sp
c = 카메라객체?
@더필요한내용
SurfaceView 프레임워크를 통해 activity? 화면? 생성과정
C++에 익숙치않아서 파악이 힘든게많음 C++에 익숙해져야함
프레임워크보다 낮은레벨계층도 좀알아야 더 확실한 흐름이 파악될듯함
서비스등록,연결부분 파악하기힘듬
JNI에서 실제로 어떤과정을 통해 native와 연결되는것인지
카메라의 다른 동작들을 확인하려면 4대 컴포넌트와 관련된 프레임워크들을 잘봐야할것같다.