相机原生代码底层逻辑

2024-01-21

我试图更好地理解相机本机代码的底层逻辑,但在寻找方法定义时我似乎陷入了死胡同Camera::connect()和其他声明的函数Camera.h.

我遵循的步骤如下:

  1. In the master branch I located Camera.java https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/hardware/Camera.java, which contains the logic for resolving cameras, selecting CameraInfo.CAMERA_FACING_BACK when it is encountered:
    • Camera.open() calls Camera.getCameraInfo(int, CameraInfo)对于每个 intCamera.getNumberOfCameras().
    • Camera.getCameraInfo(int, CameraInfo)依次调用原生函数Camera._getCameraInfo(int, CameraInfo).
  2. Delving 进入JNI https://android.googlesource.com/platform/frameworks/base/+/master/core/jni/android_hardware_Camera.cpp:

    • android_hardware_Camera_getCameraInfo(JNIEnv*, jobject, jint, jobject)然后调用静态方法Camera::getCameraInfo(jint, CameraInfo*),它似乎是通过以下方式声明的:

      #include <camera/Camera.h>
      
  3. 浏览和搜索主分支似乎没有给出任何点击camera/Camera.h。例如,我能找到的唯一结果是旧标签在姜饼分支 https://android.googlesource.com/platform/frameworks/base/+/gingerbread/include/camera/Camera.h。这里只有一个方法声明:

    static  status_t    getCameraInfo(int cameraId,
                                  struct CameraInfo* cameraInfo);
    
  4. 但是,方法主体似乎没有在任何地方定义。

最后两步是我感到困惑的地方。哪里camera/Camera.h为更新版本的 Android 定义的?最后,方法体在哪里Camera实际上定义了?


在ICS中,Camera::getCameraInfo(jint, CameraInfo*)在frameworks/av/camera/Camera.cpp中定义为

status_t Camera::getCameraInfo(int cameraId,
                               struct CameraInfo* cameraInfo) {
    const sp<ICameraService>& cs = getCameraService();
    if (cs == 0) return UNKNOWN_ERROR;
    return cs->getCameraInfo(cameraId, cameraInfo);
}

然后它抓取一个活页夹对象CameraService并致电getCameraInfo on CameraService.

status_t CameraService::getCameraInfo(int cameraId,
                                      struct CameraInfo* cameraInfo) {
    ...
    struct camera_info info;
    status_t rc = mModule->get_camera_info(cameraId, &info);
    ...
    return rc;
}

The mModule包含您设备上相机的实际实现。不同的设备可能有不同的实现。例如你可以找到QualcommCamera under 硬件/高通/相机/QualcommCamera.cpp https://android.googlesource.com/platform/hardware/qcom/camera/+/android-4.2.2_r1/QualcommCamera.cpp.

然后看一下connect. The connect做了类似的工作并最终调用CameraService::connect。在该方法中,有一个CameraClient初始化由mModule。因此,当您使用客户端执行某些操作时,您实际上是在使用特定于设备的实现。

多说一句,mModule的初始化是hw_get_module in CameraService::onFirstRef.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

相机原生代码底层逻辑 的相关文章

随机推荐

  • 动态更改IP地址?

    考虑一下这个案例 我想经常抓取网站 但有一天 限制后我的IP地址被阻止了 那么 如何动态更改我的IP地址或任何其他想法 一种方法使用Scrapy http scrapy org 将使用两个组件 RandomProxy and RotateU
  • 了解oauth 2.0中客户端id、客户端密钥的需求

    我有一个网站 要求用户通过提供电子邮件和密码来登录以获得访问令牌 其中访问令牌令牌用于访问 api 然后 用户可以在访问令牌提供的范围内获得读 写的访问权限 那么 这里我想了解的是 client id 和 client Secret 在这种
  • Automapper、泛型、dto funtimes

    这是交易 我有一个报告设计器 用户可以根据一些预定义的数据集创建报告 他们可以选择要包含在报告中的一组列 然后在运行报告时 通过使用自动映射器将 NHibernate 集合映射到 dto 类集合来创建 IList 这样做的问题是 DTO 集
  • E:软件包“oracle-java8-installer”没有安装候选者

    我尝试使用以下命令安装 java8 sudo add apt repository ppa webupd8team java sudo apt get update sudo apt get install oracle java8 ins
  • React Bootstrap 弹出窗口在外部点击时关闭

    React Bootstrap 提供了一个弹出窗口控件 我希望在单击弹出窗口外部时将其关闭 其方式与模态的工作方式类似 默认情况下点击开箱即用即可将其关闭 有没有办法使用 ReactBootstrap 来做到这一点 或者我需要自定义代码吗
  • SwiftUI – 如何将 NavigationView 的标题设置为大标题(或小标题)?

    使用 SwiftUI 如何更改导航栏的标题大小 在标准标题或大标题之间进行选择 SwiftUI iOS 14 NavigationView TopLevelView navigationBarTitleDisplayMode inline
  • 函数声明与函数定义

    如果我有这个原型 int bar int 对于编译器我是宣告标识符bar 如果我有这样的定义 int bar int a 对于编译器我是defining标识符bar 一般来说 定义会为对象分配存储空间 但是 函数声明也是如此吗 另外在这种情
  • C++:提取分析数学表达式的符号/变量

    我有用户可以提供的表达式 例如 a sin w t a b c x 2 y 2 2 我愿意just获取那里的变量列表 我不需要做任何替换 所以 对于第一个公式 它是 a w t 对于第二个 a b c 对于最后一个 x y 该表达式主要是为
  • 使用 yum 安装同一软件包的多个版本? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一台安装了奇怪的内部版本 MySQL 的服务器 并且想在该节点上安装collectd 不幸的是 collectd 依赖于 MySQL 并且安装失败
  • 用于将数据从业务机会复制到相关自定义对象的自定义按钮

    我有一个自定义对象 用于映射到机会的产品设置 这是一种一对多的关系 一个机会映射到许多设置对象 但一个设置对象仅映射到一个机会 机会有一些设置字段需要充当相关自定义对象的默认值 不幸的是 我不能只在公式中指定它们 出现错误 我想做的是有一个
  • 使用钩子时等待状态更新

    如何使用 Hooks 等待状态更新 当我提交表格时 我需要检查是否termsValidation在运行一些附加代码之前为 false 如果状态刚刚发生变化 它就不会注意到这一点 import React useState from reac
  • 在常见情况下什么时候适合使用 Core Animation 而不是 UIView 动画

    这与许多小错误有关 这些小错误可能被一个人通常认为是次要的 但另一个人则认为是重大错误 我越来越注意到的是 当使用所有口味时UIView animateWithDuration 它实际上修改了不必要的东西 例如我的视图的多个属性 以执行简单
  • 如何从右向左滑动切换div?

    请看这个小提琴http jsfiddle net MKwwH http jsfiddle net MKwwH 我想要链接images link从右向左滑动切换 document ready function hidden hide soun
  • 我可以使用“com.apple.springboard.lockcomplete”通知吗?

    我试图找到设备锁定状态 因为 UIApplicationState 在锁定设备时给出了错误的状态 它给出了 UIApplicationStateActive 几秒钟 我找到了一种解决方案达尔文通知 https developer apple
  • Visual Studio 还是 GCC? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Java 中对象的链式调用和继承

    当声明链式调用的方法时 通常它returns this在该方法的末尾 所以我声明 public class Foo public Foo setTitle String title return this And public class
  • Nullable 的大小是多少?

    所以 实际上有几个问题 An int Int32 被指定为 显然 32 位 怎么样int Nullable
  • 关闭 STRICT_TRANS_TABLES 安全吗?

    我的 PHP mySQL 后端托管在外部站点上 自 2014 年以来一直运行良好 最近 它开始抛出 字段没有默认值 错误 我检查了配置并发现STRICT TRANS TABLES 这会在某些情况下为没有默认值的字段提供这些错误 我的问题是删
  • 如何在 Jmeter BeanShell 中循环 HTTP 请求并每次更新变量

    我有 2 个 HTTP 请求 一个用于从 api 获取数据 另一个用于将数据 POST 到 api GET 请求以 JSON 形式带来多个用户 POST 请求需要每个用户 1 个请求 因此我需要 根据用户数量多次循环相同的 POST 请求
  • 相机原生代码底层逻辑

    我试图更好地理解相机本机代码的底层逻辑 但在寻找方法定义时我似乎陷入了死胡同Camera connect 和其他声明的函数Camera h 我遵循的步骤如下 In the master branch I located Camera jav