您的位置:首页 > 移动开发 > Android开发

Android Camera 代码阅读: Preview过程

2016-02-14 16:46 507 查看
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">
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: