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">

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

被折叠的 条评论
为什么被折叠?



