Android Camera 代码阅读: Preview过程

本文深入解析了Android相机应用中Java层代码与JNI机制的作用,详细阐述了如何在framework层实现底层cpp函数注册,以便上层Java代码通过JNI调用native函数。同时,文章探讨了代码的执行流程、关键函数的作用以及如何进行优化,为开发者提供了一套完整的理解和实践指南。


1. 主要 功能是什么?

2. 代码在哪些文件上?

3. 流程画出来

4. 如果修改和移植?

5. 如何优化?

6. 能否用新的机制,更好的方案来取代它?



以startPreview为例,追踪代码:

App: Java层代码

android/packages/apps/src/com/android/camera.java

    // This can only be called by UI Thread.                                                   
    private void startPreview() {                                                              
        if (mPaused) {                                                                         
            return;                                                                            
        }                                                                                      
        SurfaceTexture st = mUI.getSurfaceTexture();      
                                     
     Log.v(TAG, "startPreview");                   
     mCameraDevice.startPreview();   //这个CameraProxy是从哪里蹦出来的?  framework层的?            
     mFocusManager.onPreviewStarted();             
     onPreviewStarted();                           
                                                                                                                         



JNI 层:

android/frameworks/base/core/java/android/hardware/Camera.java

注册底层cpp实现的相应函数,这样上层java就可以通过JNI调用native提供的对于函数


static JNINativeMethod camMethods[] = {                              
  { "getNumberOfCameras",                                            
    "()I",                                                           
    (void *)android_hardware_Camera_getNumberOfCameras },            
  { "_getCameraInfo",                                                
    "(ILandroid/hardware/Camera$CameraInfo;)V",                      
    (void*)android_hardware_Camera_getCameraInfo },                  
  { "native_setup",                                                  
    "(Ljava/lang/Object;ILjava/lang/String;)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 },             
  { "setPreviewTexture",                                             
    "(Landroid/graphics/SurfaceTexture;)V",                          
    (void *)android_hardware_Camera_setPreviewTexture },             
  { "setPreviewCallbackSurface",                                     
    "(Landroid/view/Surface;)V",                                     
    (void *)android_hardware_Camera_setPreviewCallbackSurface },     
  { "startPreview",                                                  
    "()V",                                                           
    (void *)android_hardware_Camera_startPreview },                  
  { "_stopPreview",                                                  
    "()V",                                                           
    (void *)android_hardware_Camera_stopPreview },   
   。。。。。。
    // Register native functions                                                
    return AndroidRuntime::registerNativeMethods(env, "android/hardware/Camera",
                                              camMethods, NELEM(camMethods));   
}                                                                               
       

typedef struct {
const char* name; //JAVA函数名
const char* signature;
void* fnPtr;     //指向C函数
} JNINativeMethod;
</pre><pre code_snippet_id="1578342" snippet_file_name="blog_20160214_9_2702828" name="code" class="html">




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值