Chromium Code Reviews| Index: android_webview/native/callback_jni_bridge.cc |
| diff --git a/android_webview/native/callback_jni_bridge.cc b/android_webview/native/callback_jni_bridge.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..ab81715fec89482e08581e09a28cd926a9f24761 |
| --- /dev/null |
| +++ b/android_webview/native/callback_jni_bridge.cc |
| @@ -0,0 +1,81 @@ |
| +// Copyright 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "android_webview/native/callback_jni_bridge.h" |
| + |
| +#include "base/android/scoped_java_ref.h" |
| +#include "base/bind.h" |
| +#include "jni/CallbackJNIBridge_jni.h" |
| + |
| +using base::Callback; |
| +using base::android::AttachCurrentThread; |
| +using base::android::ScopedJavaLocalRef; |
| +using base::android::ScopedJavaGlobalRef; |
| + |
| +namespace android_webview { |
| + |
| +class JavaValueCallbackInt { |
| + public: |
| + JavaValueCallbackInt(JNIEnv* env, |
| + const ScopedJavaLocalRef<jobject>& jvalue_callback) { |
| + jvalue_callback_.Reset(env, jvalue_callback.obj()); |
| + } |
| + |
| + void onReceiveValue(int value) { |
| + DCHECK(!jvalue_callback_.is_null()); |
|
boliu
2013/02/21 23:11:12
Would be nice if it can automatically check thread
mkosiba (inactive)
2013/02/22 18:54:31
nope, the more auto-checking we have the better. I
|
| + |
| + if (!jvalue_callback_.is_null()) { |
| + JNIEnv* env = AttachCurrentThread(); |
| + Java_CallbackJNIBridge_invokeValueCallbackInt( |
| + env, jvalue_callback_.obj(), value); |
|
boliu
2013/02/22 23:02:52
Also just realized, generic types must be an objec
mkosiba (inactive)
2013/02/25 23:43:43
no, you'd have to new up an Integer object if you
|
| + jvalue_callback_.Reset(); |
| + } |
| + } |
| + |
| + private: |
| + ScopedJavaGlobalRef<jobject> jvalue_callback_; |
| +}; |
| + |
| +Callback<void(int)> CallbackJNIBridge::FromJavaValueCallbackInt( |
|
boliu
2013/02/21 23:11:12
There is no way to use templates to interpret the
mkosiba (inactive)
2013/02/22 18:54:31
I talked to Marcus and he'd prefer us to make the
boliu
2013/02/22 23:02:52
I'm gonna push back on this a bit at least for non
|
| + JNIEnv* env, |
| + ScopedJavaLocalRef<jobject> jvalue_callback) { |
| + JavaValueCallbackInt* value_callback = |
| + new JavaValueCallbackInt(env, jvalue_callback); |
| + return base::Bind(&JavaValueCallbackInt::onReceiveValue, |
| + base::Owned(value_callback)); |
| +} |
| + |
| +ScopedJavaLocalRef<jobject> CallbackJNIBridge::ToJavaValueCallbackInt( |
| + JNIEnv* env, |
| + const Callback<void(int)>& callback) { |
| + Callback<void(int)>* native_callback = new Callback<void(int)>(callback); |
|
boliu
2013/02/21 23:11:12
new vs copy by value, the native object only holds
mkosiba (inactive)
2013/02/22 18:54:31
The Callback has an internal scoped_refptr<BindSta
|
| + ScopedJavaLocalRef<jobject> jvalue_callback = |
| + Java_CallbackJNIBridge_createValueCallbackInt( |
| + env, reinterpret_cast<int>(native_callback)); |
| + |
| + return jvalue_callback; |
| +} |
| + |
| +// static methods ------------------------------------------------------------- |
| + |
| +static void OnReceiveValueInt(JNIEnv* env, |
| + jclass clazz, |
| + jint callbackInt, |
| + jint value) { |
| + Callback<void(int)>* native_callback = |
| + reinterpret_cast<Callback<void(int)>*>(callbackInt); |
| + native_callback->Run(value); |
| +} |
| + |
| +static void DestroyInt(JNIEnv* env, jclass clazz, jint callbackInt) { |
| + Callback<void(int)>* native_callback = |
| + reinterpret_cast<Callback<void(int)>*>(callbackInt); |
| + delete native_callback; |
| +} |
| + |
| +bool RegisterCallbackJNIBridge(JNIEnv* env) { |
| + return RegisterNativesImpl(env); |
| +} |
| + |
| +} // namespace android_webview |