summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-11 14:40:52 +0000
committerbulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-11 14:40:52 +0000
commit77070f6d755000e181f63ff2febee5b220737c59 (patch)
tree68d75619c7aa9af17999f3616de9f267ffdd8e3c
parent9c5a07f1acca9999e86041a2e095fd804077e9a3 (diff)
downloadchromium_src-77070f6d755000e181f63ff2febee5b220737c59.zip
chromium_src-77070f6d755000e181f63ff2febee5b220737c59.tar.gz
chromium_src-77070f6d755000e181f63ff2febee5b220737c59.tar.bz2
Android: cleans up hand-written JNI for video_capture_device_android.cc
It's dangerous to rely on hand-written, run-time binding for JNI. By wrapping the usage in a thin class, we get build-time type-safety. It also clarifies the boundaries, and make the code on each side clearer. BUG= Review URL: https://chromiumcodereview.appspot.com/12604003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@187295 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--media/base/android/java/src/org/chromium/media/VideoCapture.java41
-rw-r--r--media/media.gyp13
-rw-r--r--media/video/capture/android/video_capture_device_android.cc47
3 files changed, 51 insertions, 50 deletions
diff --git a/media/base/android/java/src/org/chromium/media/VideoCapture.java b/media/base/android/java/src/org/chromium/media/VideoCapture.java
index 4f66ef6..0266558 100644
--- a/media/base/android/java/src/org/chromium/media/VideoCapture.java
+++ b/media/base/android/java/src/org/chromium/media/VideoCapture.java
@@ -135,7 +135,8 @@ public class VideoCapture implements PreviewCallback, OnFrameAvailableListener {
}
}
if (minDiff == Integer.MAX_VALUE) {
- Log.e(TAG, "allocate: can not find a resolution whose width is multiple of 32");
+ Log.e(TAG, "allocate: can not find a resolution whose width " +
+ "is multiple of 32");
return false;
}
mCurrentCapability.mWidth = matchedWidth;
@@ -304,6 +305,44 @@ public class VideoCapture implements PreviewCallback, OnFrameAvailableListener {
@Override
public void onFrameAvailable(SurfaceTexture surfaceTexture) { }
+ private static class ChromiumCameraInfo {
+ private final int mId;
+ private final Camera.CameraInfo mCameraInfo;
+
+ private ChromiumCameraInfo(int index) {
+ mId = index;
+ mCameraInfo = new Camera.CameraInfo();
+ Camera.getCameraInfo(index, mCameraInfo);
+ }
+
+ @CalledByNative("ChromiumCameraInfo")
+ private static int getNumberOfCameras() {
+ return Camera.getNumberOfCameras();
+ }
+
+ @CalledByNative("ChromiumCameraInfo")
+ private static ChromiumCameraInfo getAt(int index) {
+ return new ChromiumCameraInfo(index);
+ }
+
+ @CalledByNative("ChromiumCameraInfo")
+ private int getId() {
+ return mId;
+ }
+
+ @CalledByNative("ChromiumCameraInfo")
+ private String getDeviceName() {
+ return "camera " + mId + ", facing " +
+ (mCameraInfo.facing ==
+ Camera.CameraInfo.CAMERA_FACING_FRONT ? "front" : "back");
+ }
+
+ @CalledByNative("ChromiumCameraInfo")
+ private int getOrientation() {
+ return mCameraInfo.orientation;
+ }
+ }
+
private native void nativeOnFrameAvailable(
int nativeVideoCaptureDeviceAndroid,
byte[] data,
diff --git a/media/media.gyp b/media/media.gyp
index 04e7ae4..5fc573a 100644
--- a/media/media.gyp
+++ b/media/media.gyp
@@ -1426,21 +1426,8 @@
'includes': [ '../build/jni_generator.gypi' ],
},
{
- 'target_name': 'camera_jni_headers',
- 'type': 'none',
- 'variables': {
- 'jni_gen_package': 'media',
- 'input_java_class': 'android/hardware/Camera.class',
- 'input_jar_file': '<(android_sdk)/android.jar',
- },
- 'includes': [ '../build/jar_file_jni_generator.gypi' ],
- },
- {
'target_name': 'video_capture_android_jni_headers',
'type': 'none',
- 'dependencies': [
- 'camera_jni_headers',
- ],
'sources': [
'base/android/java/src/org/chromium/media/VideoCapture.java',
],
diff --git a/media/video/capture/android/video_capture_device_android.cc b/media/video/capture/android/video_capture_device_android.cc
index 4cd8e4e..d837b24 100644
--- a/media/video/capture/android/video_capture_device_android.cc
+++ b/media/video/capture/android/video_capture_device_android.cc
@@ -7,10 +7,10 @@
#include <string>
#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
#include "base/android/scoped_java_ref.h"
#include "base/string_number_conversions.h"
#include "base/stringprintf.h"
-#include "jni/Camera_jni.h"
#include "jni/VideoCapture_jni.h"
#include "media/base/video_util.h"
@@ -42,53 +42,28 @@ void VideoCaptureDevice::GetDeviceNames(Names* device_names) {
JNIEnv* env = AttachCurrentThread();
- int num_cameras = JNI_Camera::Java_Camera_getNumberOfCameras(env);
+ int num_cameras = Java_ChromiumCameraInfo_getNumberOfCameras(env);
DVLOG(1) << "VideoCaptureDevice::GetDeviceNames: num_cameras=" << num_cameras;
if (num_cameras <= 0)
return;
- // TODO(wjia): switch to using same approach as Camera when
- // jar_file_jni_generator.gypi supports system inner classes.
- std::string camera_info_string("android/hardware/Camera$CameraInfo");
-
- ScopedJavaLocalRef<jclass> camera_info_class(
- GetClass(env, camera_info_string.c_str()));
- jmethodID constructor = MethodID::Get<MethodID::TYPE_INSTANCE>(
- env, camera_info_class.obj(), "<init>", "()V");
-
- ScopedJavaLocalRef<jobject> object_camera_info(
- env, env->NewObject(camera_info_class.obj(), constructor));
-
- jfieldID field_facing = GetFieldID(env, camera_info_class, "facing", "I");
- jfieldID field_facing_front = GetStaticFieldID(
- env, camera_info_class, "CAMERA_FACING_FRONT", "I");
-
for (int camera_id = num_cameras - 1; camera_id >= 0; --camera_id) {
- JNI_Camera::Java_Camera_getCameraInfo(
- env, camera_id, object_camera_info.obj());
+ ScopedJavaLocalRef<jobject> ci =
+ Java_ChromiumCameraInfo_getAt(env, camera_id);
Name name;
- name.unique_id = StringPrintf("%d", camera_id);
- std::string facing_string;
- if (env->GetIntField(object_camera_info.obj(), field_facing) ==
- env->GetStaticIntField(camera_info_class.obj(), field_facing_front)) {
- facing_string = "front";
- } else {
- facing_string = "back";
- }
- name.device_name = StringPrintf(
- "camera %d, facing %s", camera_id, facing_string.c_str());
+ name.unique_id = StringPrintf(
+ "%d", Java_ChromiumCameraInfo_getId(env, ci.obj()));
+ name.device_name = base::android::ConvertJavaStringToUTF8(
+ Java_ChromiumCameraInfo_getDeviceName(env, ci.obj()));
device_names->push_back(name);
- jfieldID field_orientation = GetFieldID(
- env, camera_info_class, "orientation", "I");
- jint orientation = env->GetIntField(object_camera_info.obj(),
- field_orientation);
+
DVLOG(1) << "VideoCaptureDevice::GetDeviceNames: camera device_name="
<< name.device_name
<< ", unique_id="
<< name.unique_id
<< ", orientation "
- << orientation;
+ << Java_ChromiumCameraInfo_getOrientation(env, ci.obj());
}
}
@@ -108,7 +83,7 @@ VideoCaptureDevice* VideoCaptureDeviceAndroid::Create(const Name& device_name) {
// static
bool VideoCaptureDeviceAndroid::RegisterVideoCaptureDevice(JNIEnv* env) {
- return RegisterNativesImpl(env) && JNI_Camera::RegisterNativesImpl(env);
+ return RegisterNativesImpl(env);
}
VideoCaptureDeviceAndroid::VideoCaptureDeviceAndroid(const Name& device_name)