기본카메라앱 생성의 흐름

카메라생성흐름

//프레임워크 경로를 확인해 대충 어떤쪽 명령인지 감잡기..

//sp 스마트포인터, 사용자가 정의한 type T에대한 포인터를 지정가능

카메라스택

카메라생성, 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 camera = Camera::connect(cameraId, clientName,Camera::USE_CALLING_UID);

sp c = new TCam(cameraId);

c = 카메라객체?

@더필요한내용

SurfaceView 프레임워크를 통해 activity? 화면? 생성과정

C++에 익숙치않아서 파악이 힘든게많음 C++에 익숙해져야함

프레임워크보다 낮은레벨계층도 좀알아야 더 확실한 흐름이 파악될듯함

서비스등록,연결부분 파악하기힘듬

JNI에서 실제로 어떤과정을 통해 native와 연결되는것인지

카메라의 다른 동작들을 확인하려면 4대 컴포넌트와 관련된 프레임워크들을 잘봐야할것같다.