2013-04-07 41 views
4

我試圖更好地理解相機的本機代碼的基礎邏輯,但是當尋找Camera::connect()Camera.h中聲明的其他函數的方法定義時,我似乎遇到了死衚衕。相機的本機代碼的基礎邏輯

我遵循的步驟是這些:

  1. 在主分支I located Camera.java,其中包含了解決相機的邏輯,當遇到它選擇CameraInfo.CAMERA_FACING_BACK
    • Camera.open()電話Camera.getCameraInfo(int, CameraInfo)每個INT在Camera.getNumberOfCameras()
    • 反過來Camera.getCameraInfo(int, CameraInfo)調用本機的功能Camera._getCameraInfo(int, CameraInfo)
  2. 鑽研into the JNI

    • android_hardware_Camera_getCameraInfo(JNIEnv*, jobject, jint, jobject)然後調用靜態方法Camera::getCameraInfo(jint, CameraInfo*),這似乎被宣佈通過:

      #include <camera/Camera.h> 
      
  3. 瀏覽和搜索主分支沒有按似乎沒有給出的任何命中。我能找到的唯一結果是使用較舊的標籤,例如in the gingerbread branch。這裏只有一個方法聲明:

    static status_t getCameraInfo(int cameraId, 
               struct CameraInfo* cameraInfo); 
    
  4. 但是,方法體似乎沒有在任何地方定義。

最後兩個步驟是我困惑的地方。 camera/Camera.h在更新版本的Android中定義的位置在哪裏?最後,Camera的方法體在哪裏實際定義?

回答

1

在ICS中,照相機:getCameraInfo(jint,CameraInfo *)在框架/ AV /攝像機定義/ Camera.cpp作爲

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); 
} 

然後它抓住的​​粘合劑對象並調用getCameraInfo在​​。

status_t CameraService::getCameraInfo(int cameraId, 
             struct CameraInfo* cameraInfo) { 
    ... 
    struct camera_info info; 
    status_t rc = mModule->get_camera_info(cameraId, &info); 
    ... 
    return rc; 
} 

mModule包含您的設備上的實際執行相機。不同的設備可能有不同的實現。例如,你可以找到hardware/qcom/camera/QualcommCamera.cppQualcommCamera

然後看看connectconnect做了類似的工作,最後打電話給CameraService::connect。在該方法中,存在由mModule初始化的CameraClient。所以當你對客戶端做些什麼時,你實際上正在使用設備特定的實現。

再一個字,mModule初始化爲hw_get_moduleCameraService::onFirstRef