Android Camera Module Architecture and Bottom layer communication mechanism
             -----------albertChen
Android应用程序编程语言是JAVA,而linux的很多服务程序,包括一些libraries都是用c 或者c++写的,应用程序使用什么样的机制去调用这些系统函数的呢?Java的虚拟机可以通过 System.loadLibrary 来加载本地库,也可以通过JNI函数 RegisterNatives来注册与类相关联的本地方法。在Android中对于一些底层平台相关的native函数大多采用注册关联的方式来调用。
系统启动后两个重要的process:
1:App_main process: 进程通过AndroidRuntime调用register_jni_procs向JNI注册模块的native函数供JVM调用。
2:Mediaserver proces:进程注册了以下几个server:
AudioFlinger, MediaPlayerServer;CameraService.

Android Camera Application调用native 函数流程:
  首先Android Runtime调用register_android_hardware_Camera注册Camera相关的navtive函数到JNI。然后调用android_hardware_Camera_native_setup为Application创建一个client 通过openCameraHardware打开设备,并连接到CameraServer。Application 开启preview的过程与Application建立到CameraService之间连接相似。这个过程如下图:

从上面可以看出在JAVA VM 与native之间存在一个非常重要的连接层JNI即JAVA Native Interface。Android1.0平台提供了Camera相关的native接口,如果这些接口不够的话,通过这种机制我们可以方便的进行扩展,但是我们自己扩展的接口是与我们的硬件平台相关的,并不是Android官方支持的。网上有人说Android1.0不支持JNI,Android无法执行本地JNI调用,但从Android源码来看是乎不存在这种情况,至少是支持注册与类相关联的本地方法。

Android Architecture

JAVA process 与Native process之间的通信
     Native process姑且认为是以c,c++语言编写服务程序(是独立的一个进程)。JAVA process是通常说的Android Application。还是Camera模块为例。我们要建立Camera Object,与CameraService Object之间的通信。
JAVA Application调用native_setup在CameraService中创建了一个Camera客户端,客户端通过getCameraService取得CameraSevice中的IBinder对象,为JAVA Application 与CamerService之间建立了一个接口ICameraService,通过这个接口我们调用BpCameraService::connect 实际上通过前面取得的IBinder对象将调用CameraService::onTransact函数在这个函数中再调用BnCameraSrvice::onTransact至此JAVA Application与CameraService之间的消息管道建立完毕。

上图中,Camera.jar Camera.cpp,ICamera, ICameraService的对象都属于java application process,当两个object之间的通信建立完毕,java application通过ICamera接口向CameraService中Camera Client发送消息。
在Native层,不同进程间两个对象需要传递消息需要继承IBinder接口,如果一个对象只需要发起连接可以继承IBinder的扩展接口BpInterface,如果需要接受连接请求可以继承BnInterface接口,比如在ICamera.cpp中有两个接口BpCamera与BnCamera,BpCamera用于发送消息,BnCamera由CameraService继承,最近消息响应通过BnCamera调用CameraService::client对象处理消息。
AudioRecord,AudioFinger,MediaPlayer其底层接口实现方式与Camera类似。

转自:http://hi.baidu.com/albertchen521/item/3ba9b4e26e4eddd4eb34c960

android Camera模块分析的更多相关文章

  1. Android 下载模块分析(DownloadManager和DownloadProvider)

    Android下载模块主要有2个部分组成:DownloadManager和DownloadProvider:其中DownloadManager提供接口供调用,具体的实现是 DownloadProvid ...

  2. Android WIFI模块分析

    一:什么是WIFI WIFI是一种无线连接技术.可用于手机.电脑.PDA等终端. WIFI技术产生的目的是改善基于IEEE802.11标准的无线网络产品之间的互通性,也就是说WIFI是基于802.11 ...

  3. Android Camera开发:周期性循环自动聚焦auto focus挂掉原因分析(preview is not enabled)

    参考:Android Camera开发:扫描二维码,周期性循环自动聚焦auto focus挂掉原因分析(preview is not enabled) 最近做Android人脸识别时,camera在自 ...

  4. Android 4.0 Camera架构分析之Camera初始化

    Android Camera 采用C/S架构,client 与server两个独立的线程之间使用Binder通信,这已经是众所周知的了.这里将介绍Camera从设备开机,到进入相机应用是如何完成初始化 ...

  5. android camera setParameters failed 类问题分析总结

    在 monkey test 测试中出现了一例 RuntimeException ,即 setParameters failed. LOG显示为:09-01 18:47:17.348 15656 156 ...

  6. 【转】android camera(一):camera模组CMM介绍

    关键词:android  camera CMM 模组 camera参数平台信息:内核:linux系统:android 平台:S5PV310(samsung exynos 4210)  作者:xubin ...

  7. android camera(一):camera模组CMM介绍【转】

    转自:https://blog.csdn.net/kevinx_xu/article/details/8821818 androidcmm图像处理工作手机三星 关键词:android  camera ...

  8. android camera jni调用

    http://www.mamicode.com/info-detail-1002139.html how to compile  library of native camera for androi ...

  9. qcom Android Camera【转】

    本文转载自:http://blog.csdn.net/Wilsonboliu/article/details/54949196 1.总体架构 Android Camera 框架从整体上看是一个 cli ...

随机推荐

  1. Hive的执行生命周期

    1.入口$HIVE_HOME/bin/ext/cli.sh 调用org.apache.hadoop.hive.cli.CliDriver类进行初始化过程 处理-e,-f,-h等信息,如果是-h,打印提 ...

  2. [NOIP2017]时间复杂度

    题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序 ...

  3. Java实习二

    链表(java实现) Link.java public class Link{ private Node first; public Link(){ this.first = null; } //判断 ...

  4. HighCharts 在IE8下饼图不显示的问题

    HighCharts饼图用来做数据统计时,在IE8下发现某些图形不能正确显示出来. 在IE8下面会报  'this.renderer.gradients' 为空或不是对象 这样的错误.. 解决方法: ...

  5. select * from table_name where 1=1的

    我们先来看看这个语句的结果:select * from table where 1=1,其中where 1=1,由于1=1永远是成立的,返回TRUE,条件为真:所以,这条语句,就相当于select * ...

  6. Deep Learning入门

    今天在看电影的过程中我忽然想起来几件特别郁闷的事,我居然忘了上周三晚上的计算机接口的实验课!然后我又想起来我又忘了上周六晚上的就业指导!然后一阵恐惧与责备瞬间涌了上来.这事要是在以前我绝对会释然的,可 ...

  7. vim 的寄存器

    If you've been following my series on Vim, it should be clear now that Vim has a pretty clear philos ...

  8. Rem实现移动端适配

    移动端适配 web页面跑在手机端(h5页面) 跨平台 基于webview() 基于webkit 常见适配方法 pc端采用display:inline-block,让div盒子横着排 移动web:采用定 ...

  9. poj2187凸包最远点对

    暴力过了 #include<map> #include<set> #include<cmath> #include<queue> #include< ...

  10. 1-19-1 RHEL6启动原理和故障排除

    大纲: 一.RHEL6系统启动原理 BIOS--->mbr--->bootloader--->内核--->init--->/etc/rc.d/rc.sysinit---& ...