Android Camera 模塊分析(三)

第三部分 Camera的主要實現分析

  3。1 JAVA程序部分

  在packages/apps/Camera/src/com/android/camera/ 目錄的Camera。java文件中,包含了對Camera的調用

  在Camera。java中包含對包的引用:

  import android。hardware。Camera。PictureCallback;
  import android。hardware。Camera。Size;

  在這裏定義的Camera類繼承了活動Activity類,在它的內部,包含了一個 android。hardware。Camera

  public class Camera extends Activity implements View。OnClickListener, SurfaceHolder。Callback {             android。hardware。Camera mCameraDevice;

  }

  對Camera功能的一些調用以下所示:

  mCameraDevice。takePicture(mShutterCallback, mRawPictureCallback, mJpegPictureCallback);
  mCameraDevice。startPreview();
  mCameraDevice。stopPreview();
  startPreview、stopPreview 和takePicture等接口就是經過JAVA本地調用(JNI)來實現的。
  frameworks/base/core/java/android/hardware/目錄中的Camera。java文件提供了一個JAVA類:Camera。
  public class Camera {
  }

  在這個類當中,大部分代碼使用JNI調用下層獲得,例如:

  public void setParameters(Parameters params) {
  Log。e(TAG, "setParameters()");
  //params。dump();
  native_setParameters(params。flatten());
  }

  再者,例如如下代碼:

  public final void setPreviewDisplay(SurfaceHolder holder) {
  setPreviewDisplay(holder。getSurface());
  }

  private native final void setPreviewDisplay(Surface surface);

  兩個setPreviewDisplay參數不一樣,後一個是本地方法,參數爲Surface類型,前一個經過調用後一個實現,但本身的參數以SurfaceHolder爲類型。

   3。2 Camera的JAVA本地調用部分

  Camera的JAVA本地調用(JNI)部分在frameworks/base/core/jni/目錄的android_hardware_Camera。cpp中的文件中實現。

  android_hardware_Camera。cpp之中定義了一個JNINativeMethod(JAVA本地調用方法)類型的數組gMethods,以下所示:java

static JNINativeMethod camMethods[] = { 
{"native_setup","(Ljava/lang/Object;)V",(void*)android_hardware_Camera_native_setup }, 
{"native_release","()V",(void*)android_hardware_Camera_release }, 
{"setPreviewDisplay","(Landroid/view/Surface;)V",(void *)android_hardware_Camera_setPreviewDisplay }, 
{"startPreview","()V",(void *)android_hardware_Camera_startPreview }, 
{"stopPreview", "()V", (void *)android_hardware_Camera_stopPreview }, 
{"setHasPreviewCallback","(Z)V",(void *)android_hardware_Camera_setHasPreviewCallback }, 
{"native_autoFocus","()V",(void *)android_hardware_Camera_autoFocus }, 
{"native_takePicture", "()V", (void *)android_hardware_Camera_takePicture }, 
{"native_setParameters","(Ljava/lang/String;)V",(void *)android_hardware_Camera_setParameters }, 
{"native_getParameters", "()Ljava/lang/String;",(void *)android_hardware_Camera_getParameters } 
};
JNINativeMethod的第一個成員是一個字符串,表示了JAVA本地調用方法的名稱,這個名稱是在JAVA程序中調用的名稱;第二個成員也是一個字符串,表示JAVA本地調用方法的參數和返回值;第三個成員是JAVA本地調用方法對應的C語言函數。

  register_android_hardware_Camera 函數將gMethods註冊爲的類"android/media/Camera",其主要的實現以下所示。android

int register_android_hardware_Camera(JNIEnv *env) 
{ 
// Register native functions 
return AndroidRuntime::registerNativeMethods(env, "android/hardware/Camera", 
camMethods, NELEM(camMethods)); 
}
 "android/hardware/Camera"對應JAVA的類android。hardware。Camera。
相關文章
相關標籤/搜索