文章根据这个整理而成。http://blog.chinaunix.net/uid-25314474-id-2938255.html。找到最后才发现上面介绍的Camera竟然是基于Android1.0写的文章,顿时泪奔,不过也能从中学到知识。可以通过 http://androidxref.com/ 在线查看源码进行学习。
我6月4号写了大概,现在把native的binder看了一遍,再来缕下camera代码。 很多知识是从安卓框架揭秘看的。
写在前面的话android_hardware_Camera.cpp中的Camera调用Camera.cpp中的方法,然后Camera.cpp中先连接CameraService(用的是实名binder调用)。CameraService.cpp返回获取Icamera(这个是匿名Binder远程调用传递的),在Camera.cpp返回的ICamera远程调用CameraService::Client中的对应方法,然后CameraService::Client向下用hal打开驱动,在CameraService::Client中通过ICameraClient回调到Camera.cpp(这个也是匿名Binder调用)中,然后返回JNI,返回Camera.java到上层
其中涉及到三个Binder远程跨进程调用。三个接口ICameraClient,ICameraService,ICamera。
上层应用调用android/hardware/Camera.java
最上层的应用是packages/apps/Camera/src/com/android/camera/Camera.java.
android.hardware.Camera mCameraDevice; //mCameraDevice通过CameraHolder.instance().open打开
frameworks/base/core/java/android/hardware/Camera.java
public class Camera {
//在这个类当中,大部分代码使用JNI调用下层得到,例如:
public void setParameters(Parameters params) {
native_setParameters(params.flatten());
}
public final void setPreviewDisplay(SurfaceHolder holder) {
setPreviewDisplay(holder.getSurface());
} //两个setPreviewDisplay参数不同,后一个是本地方法,参数为Surface类型,
//前一个通过调用后一个实现,但自己的参数以SurfaceHolder为类型。
private native final void setPreviewDisplay(Surface surface);
}
Camera的JAVA本地调用部分(JNI):
frameworks/base/core/jni/android_hardware_Camera.cpp
这个类承上启下的作用,上层调用参数传递要经过这个类,参数设置结束,结果要通过此类返回给app. 先java调c++,然后在c++调java返回camera.java
这部分内容编译成为目标是libandroid_runtime.so
android_hardware_Camera.cpp之中定义了一个JNINativeMethod(JAVA本地调用方法)类型的数组gMethods,如下所示
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 },
{ "previewEnabled","()Z",(void *)android_hardware_Camera_previewEnabled },
{ "setHasPreviewCallback","(ZZ)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 },
{ "reconnect", "()V", (void*)android_hardware_Camera_reconnect },
{ "lock", "()I", (void*)android_hardware_Camera_lock },
{ "unlock", "()I",(void*)android_hardware_Camera_unlock },
};
JNINativeMethod的第一个成员是一个字符串,表示了JAVA本地调用方法的名称,这个名称是在JAVA程序中调用的名称;第二个成员也是一个字符串,表示JAVA本地调用方法的参数和返回值;第三个成员是JAVA本地调用方法对应的C++语言函数。
register_android_hardware_Camera 函数将gMethods注册为的类"android/media/Camera",其主要的实现如下所示
int register_android_hardware_Camera(JNIEnv *env)
{ // Register native functions
return AndroidRuntime::registerNativeMethods(env, "android/hardware/Camera",
camMethods, NELEM(camMethods));
}
冻酸奶(Froyo) 2..2
/frameworks/base/include/camera/
Camera.h CameraHardwareInterface.h CameraParameters.h ICamera.h ICameraClient.h ICameraService.h
/frameworks/base/libs/camera/ 这部分内容被编译成库libcamera_client.so</