diff options
author | bulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-11 14:40:52 +0000 |
---|---|---|
committer | bulach@chromium.org <bulach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-11 14:40:52 +0000 |
commit | 77070f6d755000e181f63ff2febee5b220737c59 (patch) | |
tree | 68d75619c7aa9af17999f3616de9f267ffdd8e3c | |
parent | 9c5a07f1acca9999e86041a2e095fd804077e9a3 (diff) | |
download | chromium_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.java | 41 | ||||
-rw-r--r-- | media/media.gyp | 13 | ||||
-rw-r--r-- | media/video/capture/android/video_capture_device_android.cc | 47 |
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) |