转自: http://hi.baidu.com/albertchen521/blog/item/850ddf11e30a6106203f2ea5.html  

   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类似。

更多相关文章

  1. Android(安卓)调用相机和调用图库
  2. Android中多层Fragment嵌套,调用相册返回Uri无法显示图片的问题解
  3. android调用浏览器打开网页链接
  4. (Android)调用百度地图api之添加覆盖物
  5. android scrollview嵌套listview出现高度显示不全解决方案
  6. Android(安卓)反射调用类
  7. 在Android中使用NDK调用OpenGl
  8. android 使用include 调用内部组件
  9. 箭头函数的基础使用

随机推荐

  1. tsconfig.json文件各字段吐血整理
  2. PHP中针对区域语言标记信息的操作
  3. Caffeine缓存的简单介绍
  4. Java 中 long 是不是原子操作?
  5. 小白学Python:Python的基本数据类型
  6. 10月18日作业-MYSQL新增表及导出
  7. 香港虚拟主机是什么?有哪些推荐?需要备案吗
  8. JSON与mysql
  9. js执行机制与异步任务
  10. 为什么编程都带点强迫症?