在哪里可以找到 Android 相机 API 锁定机制的实现?
Where to find the implementation of the Android Camera API locking mechanism?
相机 API 使用 open() 和 release() 调用来防止来自不同 apps/processes 的多次访问,但我有点想知道底层机制是如何工作的。例如,是否存在跨进程的互斥量共享?谁能指出我正确的地方,我做了一些 Google 搜索,但找不到源代码。
我链接了一些 kitkat 源代码,因为它是 android.hardware.camera2
引入之前的最后一个版本。
锁是这样试的:
remote()->transact(LOCK, data, &reply);
其中 remote()
似乎是系统服务。参考这个关于远程的回答:Implementation of remote()
Android源代码
public native final void lock();
static void android_hardware_Camera_lock(JNIEnv *env, jobject thiz)
{
ALOGV("lock");
sp<Camera> camera = get_native_camera(env, thiz, NULL);
if (camera == 0) return;
if (camera->lock() != NO_ERROR) {
jniThrowRuntimeException(env, "lock failed");
}
}
https://android.googlesource.com/platform/frameworks/av/+/android-4.4.4_r2.0.1/camera/Camera.cpp:
status_t Camera::lock()
{
sp <ICamera> c = mCamera;
if (c == 0) return NO_INIT;
return c->lock();
}
class ICamera: public IInterface
{
// prevent other processes from using this ICamera interface
virtual status_t lock() = 0;
}
https://android.googlesource.com/platform/frameworks/av/+/android-4.4.4_r2.0.1/camera/ICamera.cpp:
class BpCamera: public BpInterface<ICamera>
{
virtual status_t lock()
{
Parcel data, reply;
data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
remote()->transact(LOCK, data, &reply);
return reply.readInt32();
}
}
相机 API 使用 open() 和 release() 调用来防止来自不同 apps/processes 的多次访问,但我有点想知道底层机制是如何工作的。例如,是否存在跨进程的互斥量共享?谁能指出我正确的地方,我做了一些 Google 搜索,但找不到源代码。
我链接了一些 kitkat 源代码,因为它是 android.hardware.camera2
引入之前的最后一个版本。
锁是这样试的:
remote()->transact(LOCK, data, &reply);
其中 remote()
似乎是系统服务。参考这个关于远程的回答:Implementation of remote()
Android源代码
public native final void lock();
static void android_hardware_Camera_lock(JNIEnv *env, jobject thiz)
{
ALOGV("lock");
sp<Camera> camera = get_native_camera(env, thiz, NULL);
if (camera == 0) return;
if (camera->lock() != NO_ERROR) {
jniThrowRuntimeException(env, "lock failed");
}
}
https://android.googlesource.com/platform/frameworks/av/+/android-4.4.4_r2.0.1/camera/Camera.cpp:
status_t Camera::lock()
{
sp <ICamera> c = mCamera;
if (c == 0) return NO_INIT;
return c->lock();
}
class ICamera: public IInterface
{
// prevent other processes from using this ICamera interface
virtual status_t lock() = 0;
}
https://android.googlesource.com/platform/frameworks/av/+/android-4.4.4_r2.0.1/camera/ICamera.cpp:
class BpCamera: public BpInterface<ICamera>
{
virtual status_t lock()
{
Parcel data, reply;
data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
remote()->transact(LOCK, data, &reply);
return reply.readInt32();
}
}