转自: 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. 在四大主件以外的类中 怎么使用Context
  3. [Android] 调用相机、打开相册、裁剪图片
  4. Android创建快捷方式图标
  5. android录音实现
  6. Android(安卓)调用中国气象的webservice
  7. Android(安卓)Audio代码分析14 - testPlaybackHeadPositionIncre
  8. Android重写view时onAttachedToWindow () 和 onDetachedFromWind
  9. 箭头函数的基础使用

随机推荐

  1. sssssssssssssss
  2. Spring
  3. Android(安卓)ListView下拉刷新 Demo
  4. android 自定义checkbox大小和图片[已验
  5. Android(安卓)注解,注入框架
  6. git checkout -B android 5648d4e 不行啊
  7. 跑马灯(横向滚动)
  8. Android:密码显示隐藏
  9. 加速Android(安卓)Studio/Gradle构建
  10. Android(安卓)SeekBar的使用