La lógica subyacente del código nativo de la cámara
Estoy tratando de entender mejor la lógica subyacente del código nativo de la cámara, pero parece que estoy golpeando un callejón sin salida al buscar la definición de método para Camera::connect()
y otras funciones declaradas desde Camera.h
.
Los pasos que he seguido son los siguientes:
- Cargando el módulo del kernel en el núcleo de Android
- Cómo encontrar fácilmente el origen de una clase android
- Agregue APKs preinstalados a Android AOSP system.img
- Cómo reconstruir el código fuente de Android después de realizar cambios en los archivos de origen de Android
- Cómo sincronizar sólo Android 2.2 código froyo?
- En la rama principal
Camera.java
, que contiene la lógica para resolver cámaras, seleccionandoCameraInfo.CAMERA_FACING_BACK
cuando se encuentra:-
Camera.open()
llama aCamera.getCameraInfo(int, CameraInfo)
para cada int enCamera.getNumberOfCameras()
. -
Camera.getCameraInfo(int, CameraInfo)
a su vez llama a la función nativaCamera._getCameraInfo(int, CameraInfo)
.
-
-
Aprovechando el JNI :
-
android_hardware_Camera_getCameraInfo(JNIEnv*, jobject, jint, jobject)
invoca entonces el método estáticoCamera::getCameraInfo(jint, CameraInfo*)
, que parece ser declarado a través de:#include <camera/Camera.h>
-
-
Navegar y buscar en la rama principal no parece dar ningún resultado para la
camera/Camera.h
. El único resultado que pude encontrar fue en etiquetas más antiguas, por ejemplo en la rama de pan de jengibre . Aquí sólo hay una declaración de método:static status_t getCameraInfo(int cameraId, struct CameraInfo* cameraInfo);
-
Sin embargo, el cuerpo del método no parece estar definido en ninguna parte.
Los dos últimos pasos son donde estoy confundido. ¿Dónde está definida camera/Camera.h
para las versiones más recientes de Android? Y finalmente, ¿dónde están los cuerpos de método de la Camera
realmente definidos?
- Compilación de un AOSP deodexed?
- Cómo identificar la fuente Conscrypt utilizada en el código de configuración de seguridad de red de Android N?
- Creación de AOSP en un dispositivo personalizado
- Error: la generación de código fuente de Android en eclipse
- ¿Puedo programar radio en android?
- Android: ¿Cómo emparejar los dispositivos bluetooth de forma programática?
- Buscando la implementación de DiskLruCache en la fuente ICS
- Qué hacer con el error curl clone.bundle en AOSP repo sync
En ICS, la cámara :: getCameraInfo (jint, CameraInfo *) se define en frameworks / av / camera / Camera.cpp como
status_t Camera::getCameraInfo(int cameraId, struct CameraInfo* cameraInfo) { const sp<ICameraService>& cs = getCameraService(); if (cs == 0) return UNKNOWN_ERROR; return cs->getCameraInfo(cameraId, cameraInfo); }
A continuación, agarra un objeto encuadernador de CameraService
y llama a getCameraInfo
en CameraService
.
status_t CameraService::getCameraInfo(int cameraId, struct CameraInfo* cameraInfo) { ... struct camera_info info; status_t rc = mModule->get_camera_info(cameraId, &info); ... return rc; }
El mModule
contiene la implementación real de la cámara en su dispositivo. Diferentes dispositivos pueden tener diferentes implementaciones. Por ejemplo, puede encontrar QualcommCamera
en hardware / qcom / camera / QualcommCamera.cpp .
A continuación, eche un vistazo a connect
. La connect
realiza un trabajo similar y finalmente llama CameraService::connect
. En ese método, hay un CameraClient
inicializado por el mModule
. Así que cuando haces algo con el cliente, realmente estás trabajando con la implementación específica del dispositivo.
Una palabra más, el mModule es inicializado por hw_get_module
en CameraService::onFirstRef
.
Parece que después de Gingerbread, algún código se trasladó a un marco diferente. He localizado la camera/Camera.h
en el repositorio platform/frameworks/av
.
Encontré la definición del cuerpo del método en Camera.cpp
.
- Juega RTP stream withouth RTSP en Android VideoView
- Descarga de archivos / archivos subidos en Android