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:

  1. En la rama principal Camera.java , que contiene la lógica para resolver cámaras, seleccionando CameraInfo.CAMERA_FACING_BACK cuando se encuentra:
    • Camera.open() llama a Camera.getCameraInfo(int, CameraInfo) para cada int en Camera.getNumberOfCameras() .
    • Camera.getCameraInfo(int, CameraInfo) a su vez llama a la función nativa Camera._getCameraInfo(int, CameraInfo) .
  2. Aprovechando el JNI :

    • android_hardware_Camera_getCameraInfo(JNIEnv*, jobject, jint, jobject) invoca entonces el método estático Camera::getCameraInfo(jint, CameraInfo*) , que parece ser declarado a través de:

       #include <camera/Camera.h> 
  3. 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); 
  4. 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?

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 .

  • AOSP y IntelliJ IDEA
  • Preguntas sobre los permisos de Android
  • ¿Por qué Toast.makeText y no Toast nuevo
  • Realizar cambios persistentes en init.rc
  • ¿Cómo puedo desproteger el código fuente de Android en el sistema operativo Windows?
  • No se puede generar la imagen de recuperación con AOSP 4.2.2
  • AOSP Privileged vs System app
  • Proceso de construcción de Android secreto
  • Cómo construir la fuente de Android SDK para obtener Android.jar
  • Cómo compilar Helloworld con el código fuente de Android
  • ¿Cómo puedo activar la nueva función Bluetooth A2DP Sink introducida en Lollipop?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.