Index: content/common/android/surface_texture_bridge.cc |
diff --git a/content/common/android/surface_texture_bridge.cc b/content/common/android/surface_texture_bridge.cc |
index e2376485a6fdc7d04b9471c53e189588a2846782..bc17c13fff99528722c1293ebf975022d9e1bf0e 100644 |
--- a/content/common/android/surface_texture_bridge.cc |
+++ b/content/common/android/surface_texture_bridge.cc |
@@ -7,6 +7,7 @@ |
#include "base/android/jni_android.h" |
#include "base/logging.h" |
#include "content/common/android/surface_texture_listener.h" |
+#include "jni/SurfaceTexture_jni.h" |
using base::android::AttachCurrentThread; |
using base::android::CheckException; |
@@ -14,17 +15,28 @@ using base::android::GetClass; |
using base::android::GetMethodID; |
using base::android::ScopedJavaLocalRef; |
+namespace { |
+bool g_jni_initialized = false; |
+ |
+void RegisterNativesIfNeeded(JNIEnv* env) { |
+ if (!g_jni_initialized) { |
+ JNI_SurfaceTexture::RegisterNativesImpl(env); |
+ g_jni_initialized = true; |
+ } |
+} |
+} // namespace |
+ |
namespace content { |
SurfaceTextureBridge::SurfaceTextureBridge(int texture_id) |
: texture_id_(texture_id) { |
JNIEnv* env = AttachCurrentThread(); |
CHECK(env); |
+ RegisterNativesIfNeeded(env); |
- j_class_.Reset(GetClass(env, "android/graphics/SurfaceTexture")); |
- jmethodID constructor = GetMethodID(env, j_class_, "<init>", "(I)V"); |
- ScopedJavaLocalRef<jobject> tmp(env, |
- env->NewObject(j_class_.obj(), constructor, texture_id)); |
+ ScopedJavaLocalRef<jobject> tmp( |
+ JNI_SurfaceTexture::Java_SurfaceTexture_Constructor( |
+ env, texture_id)); |
DCHECK(!tmp.is_null()); |
j_surface_texture_.Reset(tmp); |
} |
@@ -34,17 +46,12 @@ SurfaceTextureBridge::~SurfaceTextureBridge() { |
CHECK(env); |
// Release the listener. |
- const char* method_signature = |
- "(Landroid/graphics/SurfaceTexture$OnFrameAvailableListener;)V"; |
- jmethodID method = GetMethodID(env, j_class_, "setOnFrameAvailableListener", |
- method_signature); |
- env->CallVoidMethod(j_surface_texture_.obj(), method, NULL); |
- CheckException(env); |
+ JNI_SurfaceTexture::Java_SurfaceTexture_setOnFrameAvailableListener( |
+ env, j_surface_texture_.obj(), NULL); |
// Release graphics memory. |
- jmethodID release = GetMethodID(env, j_class_, "release", "()V"); |
- env->CallVoidMethod(j_surface_texture_.obj(), release); |
- CheckException(env); |
+ JNI_SurfaceTexture::Java_SurfaceTexture_release( |
+ env, j_surface_texture_.obj()); |
} |
void SurfaceTextureBridge::SetFrameAvailableCallback( |
@@ -54,26 +61,22 @@ void SurfaceTextureBridge::SetFrameAvailableCallback( |
// Since the listener is owned by the Java SurfaceTexture object, setting |
// a new listener here will release an existing one at the same time. |
- ScopedJavaLocalRef<jobject> j_listener(env, |
+ ScopedJavaLocalRef<jobject> j_listener( |
+ env, |
SurfaceTextureListener::CreateSurfaceTextureListener(env, callback)); |
DCHECK(!j_listener.is_null()); |
// Set it as the onFrameAvailableListener for our SurfaceTexture instance. |
- const char* method_signature = |
- "(Landroid/graphics/SurfaceTexture$OnFrameAvailableListener;)V"; |
- jmethodID method = GetMethodID(env, j_class_, "setOnFrameAvailableListener", |
- method_signature); |
- env->CallVoidMethod(j_surface_texture_.obj(), method, j_listener.obj()); |
- CheckException(env); |
+ JNI_SurfaceTexture::Java_SurfaceTexture_setOnFrameAvailableListener( |
+ env, j_surface_texture_.obj(), j_listener.obj()); |
} |
void SurfaceTextureBridge::UpdateTexImage() { |
JNIEnv* env = AttachCurrentThread(); |
CHECK(env); |
- jmethodID method = GetMethodID(env, j_class_, "updateTexImage", "()V"); |
- env->CallVoidMethod(j_surface_texture_.obj(), method); |
- CheckException(env); |
+ JNI_SurfaceTexture::Java_SurfaceTexture_updateTexImage( |
+ env, j_surface_texture_.obj()); |
} |
void SurfaceTextureBridge::GetTransformMatrix(float mtx[16]) { |
@@ -81,9 +84,8 @@ void SurfaceTextureBridge::GetTransformMatrix(float mtx[16]) { |
CHECK(env); |
ScopedJavaLocalRef<jfloatArray> jmatrix(env, env->NewFloatArray(16)); |
- jmethodID method = GetMethodID(env, j_class_, "getTransformMatrix", "([F)V"); |
- env->CallVoidMethod(j_surface_texture_.obj(), method, jmatrix.obj()); |
- CheckException(env); |
+ JNI_SurfaceTexture::Java_SurfaceTexture_getTransformMatrix( |
+ env, j_surface_texture_.obj(), jmatrix.obj()); |
jboolean is_copy; |
jfloat* elements = env->GetFloatArrayElements(jmatrix.obj(), &is_copy); |
@@ -97,11 +99,9 @@ void SurfaceTextureBridge::SetDefaultBufferSize(int width, int height) { |
JNIEnv* env = AttachCurrentThread(); |
CHECK(env); |
- jmethodID method = GetMethodID(env, j_class_, |
- "setDefaultBufferSize", "(II)V"); |
- env->CallVoidMethod(j_surface_texture_.obj(), method, |
- static_cast<jint>(width), static_cast<jint>(height)); |
- CheckException(env); |
+ JNI_SurfaceTexture::Java_SurfaceTexture_setDefaultBufferSize( |
+ env, j_surface_texture_.obj(), static_cast<jint>(width), |
+ static_cast<jint>(height)); |
} |
} // namespace content |