Rk3399 android7.1 camera 分析

-、Android app
    private Camera mCamera; <<==========>> frameworks/base/core/java/android/hardware/Camera.java

    Camera.getNumberOfCameras();<<==========>> frameworks/base/core/jni/android_hardware_Camera.cpp


二、android_hardware_Camera.cpp 调用的是 Camera.cpp 里面的方法 <<==========>>frameworks/av/camera/Camera.cpp

    我们看看Camera 这个类的定义

        class Camera :public CameraBase<Camera>,
                    public ::android::hardware::BnCameraClient
                {
                                    .....
                         }

    这个类继承与CameraBase 和 BnCameraClient

三、我们看 CameraBase 这个类的定义
        template <typename TCam, typename TCamTraits = CameraTraits<TCam> >
        class CameraBase : public IBinder::DeathRecipient
        {
            .......
            }
    
    这是一个模板类该类继承于 IBinder::DeathRecipient  而     IBinder::DeathRecipient 继承于     public virtual RefBase hal层的智能指针
    
    static jint android_hardware_Camera_getNumberOfCameras(JNIEnv *env, jobject thiz)
    {
        return Camera::getNumberOfCameras(); 
     }
    这个方法的最终实现是在CameraBase里面
    
    我们再看看CameraBase这个类的方法实现  <<==========>>    frameworks/av/camera/CameraBase.cpp

    template <typename TCam, typename TCamTraits>

    int CameraBase<TCam, TCamTraits>::getNumberOfCameras() {
    const sp<::android::hardware::ICameraService> cs = getCameraService();

    if (!cs.get()) {
        // as required by the public Java APIs
        return 0;
    }
    int32_t count;
    binder::Status res = cs->getNumberOfCameras(
            ::android::hardware::ICameraService::CAMERA_TYPE_BACKWARD_COMPATIBLE,
            &count);
    if (!res.isOk()) {
        ALOGE("Error reading number of cameras: %s",
                res.toString8().string());
        count = 0;
    }
    return count;
  }

  我们发现该方法最终调用了getCameraService 方法来获取了CameraService 服务。再继续跟踪代码,

  template <typename TCam, typename TCamTraits>
  const sp<::android::hardware::ICameraService> CameraBase<TCam, TCamTraits>::getCameraService()
  {
      Mutex::Autolock _l(gLock);
      if (gCameraService.get() == 0) {
          char value[PROPERTY_VALUE_MAX];
          property_get("config.disable_cameraservice", value, "0");
          if (strncmp(value, "0", 2) != 0 && strncasecmp(value, "false", 6) != 0) {
              return gCameraService;
          }
  
          sp<IServiceManager> sm = defaultServiceManager();
          sp<IBinder> binder;
          do {
              binder = sm->getService(String16(kCameraServiceName));
              if (binder != 0) {
                  break;
              }
              ALOGW("CameraService not published, waiting...");
              usleep(kCameraServicePollDelay);
          } while(true);
          if (gDeathNotifier == NULL) {
              gDeathNotifier = new DeathNotifier();
          }
          binder->linkToDeath(gDeathNotifier);
          gCameraService = interface_cast<::android::hardware::ICameraService>(binder);
      }
      ALOGE_IF(gCameraService == 0, "no CameraService!?");
      return gCameraService;
  }    
  我们发现     getCameraService 方法返回了一个静态全局指针 gCameraService 继续查找 gCameraService 的声明与初始化,
  发现在 CameraService.cpp 里面初始化 <<==========>> frameworks/av/services/camera/libcameraservice/CameraService.cpp    
  
  static CameraService *gCameraService;

    CameraService::CameraService() :
        mEventLog(DEFAULT_EVENT_LOG_LENGTH),
        mNumberOfCameras(0), mNumberOfNormalCameras(0),
        mSoundRef(0), mModule(nullptr) {
    ALOGI("CameraService started (pid=%d)", getpid());
    gCameraService = this;

    this->camera_device_status_change = android::camera_device_status_change;
    this->torch_mode_status_change = android::torch_mode_status_change;

    mServiceLockWrapper = std::make_shared<WaitableMutexWrapper>(&mServiceLock);
}    
  
  而 CameraServic的初始化是在android开机的时候就启动了的这个服务,这个我们后续再详细讲解。
  我们继续跟踪代码 cs->getNumberOfCameras(::android::hardware::ICameraService::CAMERA_TYPE_BACKWARD_COMPATIBLE,&count);
  
  此方法的实现为 
  Status CameraService::getNumberOfCameras(int32_t type, int32_t* numCameras) {
    ATRACE_CALL();
    switch (type) {
        case CAMERA_TYPE_BACKWARD_COMPATIBLE:
            if(0 == mNumberOfNormalCameras) {
                ALOGE("No camera be found ! check again...");
                onFirstRef();
            }
            *numCameras = mNumberOfNormalCameras;
            break;
        case CAMERA_TYPE_ALL:
            *numCameras = mNumberOfCameras;
            break;
        default:
            ALOGW("%s: Unknown camera type %d",
                    __FUNCTION__, type);
            return STATUS_ERROR_FMT(ERROR_ILLEGAL_ARGUMENT,
                    "Unknown camera type %d", type);
    }
    return Status::ok();
}
  
    如果开机阶段没有找到Camera 这里会从新再找一次。 我们假设这里没有找到camera 继续跟踪代码。 跟踪onFirstRef();
    进入 onFirstRef();我们跟踪 hw_get_module()方法。 <<==========>> hardware/libhardware$
    
    int hw_get_module(const char *id, const struct hw_module_t **module)
    {
        return hw_get_module_by_class(id, NULL, module);
    }
    
    hw_get_module()方法只是对 hw_get_module_by_class(id, NULL, module)方法的一种封装,
    hw_get_module_by_class(id, NULL, module) 方法能够根据模块ID寻找硬件模块动态链接库的地址,然后调用load打开动态链接库从中获取硬件模块地址


    


     

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下方法重启 Android 系统: 1. 使用 `System.exit(0)` 方法终止应用程序进程。 2. 使用 `android.os.Process.killProcess(android.os.Process.myPid())` 方法杀死应用程序进程。 3. 使用 `PowerManager` 类的 `reboot()` 方法重启设备。 需要注意的是,第 3 种方法只能在系统级别使用,需要在应用程序中声明 `REBOOT` 权限。 例如: ``` PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); pm.reboot(null); ``` 调用 `reboot()` 方法时,可以传入一个字符串参数,表示重启的原因。 ### 回答2: 要使用代码在RK3399 Android 7.1中重启系统,您可以使用以下方法: 1. 使用Runtime类: 您可以使用Runtime类中的exec()方法来执行shell命令。可以执行"reboot"命令来重启系统。以下是一个示例代码片段: ``` try { Runtime.getRuntime().exec("reboot"); } catch (IOException e) { e.printStackTrace(); } ``` 2. 使用PowerManager类: 您可以使用PowerManager类中的reboot()方法来实现重启系统的功能。以下是一个示例代码片段: ``` PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); if (powerManager != null) { powerManager.reboot(null); } ``` 请注意,为了使用PowerManager类,您需要在AndroidManifest.xml文件中添加相应的权限:<uses-permission android:name="android.permission.REBOOT" /> 3. 使用DevicePolicyManager类: 如果您的应用程序是设备管理员应用程序,您可以使用DevicePolicyManager类中的reboot()方法来实现重启系统的功能。以下是一个示例代码片段: ``` DevicePolicyManager devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); ComponentName adminComponentName = new ComponentName(this, AdminReceiver.class); // AdminReceiver是自定义的广播接收器类,用于处理设备管理员相关的操作 devicePolicyManager.reboot(adminComponentName); ``` 需要注意的是,如果您的应用程序不是设备管理员应用程序,您需要先设置您的应用程序为设备管理员,才能使用DevicePolicyManager类。 这些是在RK3399 Android 7.1中使用代码重启系统的几种方法。您可以根据您的需求选择适合您的方法。 ### 回答3: 使用RK3399开发板上的Android 7.1系统,我们可以通过编写代码来实现系统的重启。 在Android中,系统重启可以通过调用系统服务的方法来实现。首先,我们需要获取系统服务的一个实例,然后调用相应的方法来实现重启。 具体步骤如下: 1. 获取系统服务的实例。我们可以通过调用`Context.getSystemService()`方法来获取系统服务的实例。在这个例子中,我们可以获取`Context.POWER_SERVICE`服务的实例,该服务用于控制设备的电源。 ```java PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); ``` 2. 通过系统服务实例调用重启方法。获取到`PowerManager`的实例后,我们可以调用`reboot()`方法来实现系统重启。 ```java powerManager.reboot(null); ``` 在这个例子中,`reboot()`方法接受一个字符串参数,用于传递重启的原因。我们传递`null`作为参数,表示没有特定的重启原因。 3. 添加权限。为了调用系统服务,我们需要在AndroidManifest.xml文件中添加适当的权限。在这种情况下,我们需要添加`REBOOT`权限。 ```xml <uses-permission android:name="android.permission.REBOOT" /> ``` 通过编写上述代码,我们可以在RK3399上的Android 7.1系统中实现系统的重启。请注意,系统重启将导致设备重新启动,并且会中断正在运行的任何应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值