| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "remoting/client/jni/jni_client.h" | 5 #include "remoting/client/jni/jni_client.h" |
| 6 | 6 |
| 7 #include "base/android/jni_android.h" | 7 #include "base/android/jni_android.h" |
| 8 #include "base/android/jni_string.h" | 8 #include "base/android/jni_string.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "jni/Client_jni.h" | 10 #include "jni/Client_jni.h" |
| 11 #include "remoting/client/jni/chromoting_jni_instance.h" | 11 #include "remoting/client/jni/chromoting_jni_instance.h" |
| 12 #include "remoting/client/jni/chromoting_jni_runtime.h" | 12 #include "remoting/client/jni/chromoting_jni_runtime.h" |
| 13 #include "remoting/client/jni/jni_display_handler.h" |
| 14 #include "remoting/client/jni/jni_pairing_secret_fetcher.h" |
| 13 #include "remoting/client/jni/jni_touch_event_data.h" | 15 #include "remoting/client/jni/jni_touch_event_data.h" |
| 14 | 16 |
| 15 using base::android::ConvertJavaStringToUTF8; | 17 using base::android::ConvertJavaStringToUTF8; |
| 16 using base::android::ConvertUTF8ToJavaString; | 18 using base::android::ConvertUTF8ToJavaString; |
| 17 | 19 |
| 18 namespace { | 20 namespace remoting { |
| 19 | 21 |
| 20 const int kBytesPerPixel = 4; | 22 JniClient::JniClient(ChromotingJniRuntime* runtime, |
| 23 base::android::ScopedJavaGlobalRef<jobject> java_client) |
| 24 : runtime_(runtime), |
| 25 java_client_(java_client), |
| 26 weak_factory_(this) {} |
| 27 |
| 28 JniClient::~JniClient() { |
| 29 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); |
| 30 |
| 31 // The session must be shut down first, since it depends on our other |
| 32 // components' still being alive. |
| 33 DisconnectFromHost(); |
| 21 } | 34 } |
| 22 | 35 |
| 23 namespace remoting { | 36 void JniClient::ConnectToHost(base::WeakPtr<JniDisplayHandler> display_handler, |
| 24 | 37 const std::string& username, |
| 25 JniClient::JniClient(jobject java_client) | |
| 26 : java_client_(java_client), weak_factory_(this) {} | |
| 27 | |
| 28 JniClient::~JniClient() { | |
| 29 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); | |
| 30 } | |
| 31 | |
| 32 void JniClient::ConnectToHost(const std::string& username, | |
| 33 const std::string& auth_token, | 38 const std::string& auth_token, |
| 34 const std::string& host_jid, | 39 const std::string& host_jid, |
| 35 const std::string& host_id, | 40 const std::string& host_id, |
| 36 const std::string& host_pubkey, | 41 const std::string& host_pubkey, |
| 37 const std::string& pairing_id, | 42 const std::string& pairing_id, |
| 38 const std::string& pairing_secret, | 43 const std::string& pairing_secret, |
| 39 const std::string& capabilities, | 44 const std::string& capabilities, |
| 40 const std::string& flags) { | 45 const std::string& flags) { |
| 41 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); | 46 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); |
| 42 DCHECK(!session_); | 47 DCHECK(!session_); |
| 43 session_ = new ChromotingJniInstance( | 48 DCHECK(!secret_fetcher_); |
| 44 runtime(), this, username, auth_token, host_jid, host_id, host_pubkey, | 49 secret_fetcher_.reset(new JniPairingSecretFetcher(runtime_, GetWeakPtr(), |
| 45 pairing_id, pairing_secret, capabilities, flags); | 50 host_id)); |
| 51 |
| 52 display_handler_ = display_handler; |
| 53 session_.reset(new ChromotingJniInstance( |
| 54 runtime_, GetWeakPtr(), display_handler_, |
| 55 secret_fetcher_->GetWeakPtr(), username, auth_token, host_jid, host_id, |
| 56 host_pubkey, pairing_id, pairing_secret, capabilities, flags)); |
| 46 session_->Connect(); | 57 session_->Connect(); |
| 47 } | 58 } |
| 48 | 59 |
| 49 void JniClient::DisconnectFromHost() { | 60 void JniClient::DisconnectFromHost() { |
| 50 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); | 61 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); |
| 62 display_handler_ = nullptr; |
| 51 if (session_) { | 63 if (session_) { |
| 52 session_->Disconnect(); | 64 session_->Disconnect(); |
| 53 session_ = nullptr; | 65 runtime_->network_task_runner()->DeleteSoon(FROM_HERE, |
| 66 session_.release()); |
| 54 } | 67 } |
| 55 } | 68 } |
| 56 | 69 |
| 57 void JniClient::OnConnectionState(protocol::ConnectionToHost::State state, | 70 void JniClient::OnConnectionState(protocol::ConnectionToHost::State state, |
| 58 protocol::ErrorCode error) { | 71 protocol::ErrorCode error) { |
| 59 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); | 72 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); |
| 60 | 73 |
| 61 JNIEnv* env = base::android::AttachCurrentThread(); | 74 JNIEnv* env = base::android::AttachCurrentThread(); |
| 62 Java_Client_onConnectionState(env, java_client_, state, error); | 75 Java_Client_onConnectionState(env, java_client_.obj(), state, error); |
| 63 } | 76 } |
| 64 | 77 |
| 65 void JniClient::DisplayAuthenticationPrompt(bool pairing_supported) { | 78 void JniClient::DisplayAuthenticationPrompt(bool pairing_supported) { |
| 66 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); | 79 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); |
| 67 | 80 |
| 68 JNIEnv* env = base::android::AttachCurrentThread(); | 81 JNIEnv* env = base::android::AttachCurrentThread(); |
| 69 Java_Client_displayAuthenticationPrompt(env, java_client_, pairing_supported); | 82 Java_Client_displayAuthenticationPrompt(env, java_client_.obj(), |
| 83 pairing_supported); |
| 70 } | 84 } |
| 71 | 85 |
| 72 void JniClient::CommitPairingCredentials(const std::string& host, | 86 void JniClient::CommitPairingCredentials(const std::string& host, |
| 73 const std::string& id, | 87 const std::string& id, |
| 74 const std::string& secret) { | 88 const std::string& secret) { |
| 75 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); | 89 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); |
| 76 | 90 |
| 77 JNIEnv* env = base::android::AttachCurrentThread(); | 91 JNIEnv* env = base::android::AttachCurrentThread(); |
| 78 ScopedJavaLocalRef<jstring> j_host = ConvertUTF8ToJavaString(env, host); | 92 ScopedJavaLocalRef<jstring> j_host = ConvertUTF8ToJavaString(env, host); |
| 79 ScopedJavaLocalRef<jstring> j_id = ConvertUTF8ToJavaString(env, id); | 93 ScopedJavaLocalRef<jstring> j_id = ConvertUTF8ToJavaString(env, id); |
| 80 ScopedJavaLocalRef<jstring> j_secret = ConvertUTF8ToJavaString(env, secret); | 94 ScopedJavaLocalRef<jstring> j_secret = ConvertUTF8ToJavaString(env, secret); |
| 81 | 95 |
| 82 Java_Client_commitPairingCredentials(env, java_client_, j_host.obj(), | 96 Java_Client_commitPairingCredentials(env, java_client_.obj(), j_host.obj(), |
| 83 j_id.obj(), j_secret.obj()); | 97 j_id.obj(), j_secret.obj()); |
| 84 } | 98 } |
| 85 | 99 |
| 86 void JniClient::FetchThirdPartyToken(const std::string& token_url, | 100 void JniClient::FetchThirdPartyToken(const std::string& token_url, |
| 87 const std::string& client_id, | 101 const std::string& client_id, |
| 88 const std::string& scope) { | 102 const std::string& scope) { |
| 89 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); | 103 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); |
| 90 JNIEnv* env = base::android::AttachCurrentThread(); | 104 JNIEnv* env = base::android::AttachCurrentThread(); |
| 91 | 105 |
| 92 ScopedJavaLocalRef<jstring> j_url = ConvertUTF8ToJavaString(env, token_url); | 106 ScopedJavaLocalRef<jstring> j_url = ConvertUTF8ToJavaString(env, token_url); |
| 93 ScopedJavaLocalRef<jstring> j_client_id = | 107 ScopedJavaLocalRef<jstring> j_client_id = |
| 94 ConvertUTF8ToJavaString(env, client_id); | 108 ConvertUTF8ToJavaString(env, client_id); |
| 95 ScopedJavaLocalRef<jstring> j_scope = ConvertUTF8ToJavaString(env, scope); | 109 ScopedJavaLocalRef<jstring> j_scope = ConvertUTF8ToJavaString(env, scope); |
| 96 | 110 |
| 97 Java_Client_fetchThirdPartyToken(env, java_client_, j_url.obj(), | 111 Java_Client_fetchThirdPartyToken(env, java_client_.obj(), j_url.obj(), |
| 98 j_client_id.obj(), j_scope.obj()); | 112 j_client_id.obj(), j_scope.obj()); |
| 99 } | 113 } |
| 100 | 114 |
| 101 void JniClient::SetCapabilities(const std::string& capabilities) { | 115 void JniClient::SetCapabilities(const std::string& capabilities) { |
| 102 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); | 116 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); |
| 103 JNIEnv* env = base::android::AttachCurrentThread(); | 117 JNIEnv* env = base::android::AttachCurrentThread(); |
| 104 | 118 |
| 105 ScopedJavaLocalRef<jstring> j_cap = | 119 ScopedJavaLocalRef<jstring> j_cap = |
| 106 ConvertUTF8ToJavaString(env, capabilities); | 120 ConvertUTF8ToJavaString(env, capabilities); |
| 107 | 121 |
| 108 Java_Client_setCapabilities(env, java_client_, j_cap.obj()); | 122 Java_Client_setCapabilities(env, java_client_.obj(), j_cap.obj()); |
| 109 } | 123 } |
| 110 | 124 |
| 111 void JniClient::HandleExtensionMessage(const std::string& type, | 125 void JniClient::HandleExtensionMessage(const std::string& type, |
| 112 const std::string& message) { | 126 const std::string& message) { |
| 113 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); | 127 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); |
| 114 JNIEnv* env = base::android::AttachCurrentThread(); | 128 JNIEnv* env = base::android::AttachCurrentThread(); |
| 115 | 129 |
| 116 ScopedJavaLocalRef<jstring> j_type = ConvertUTF8ToJavaString(env, type); | 130 ScopedJavaLocalRef<jstring> j_type = ConvertUTF8ToJavaString(env, type); |
| 117 ScopedJavaLocalRef<jstring> j_message = ConvertUTF8ToJavaString(env, message); | 131 ScopedJavaLocalRef<jstring> j_message = ConvertUTF8ToJavaString(env, message); |
| 118 | 132 |
| 119 Java_Client_handleExtensionMessage(env, java_client_, j_type.obj(), | 133 Java_Client_handleExtensionMessage(env, java_client_.obj(), j_type.obj(), |
| 120 j_message.obj()); | 134 j_message.obj()); |
| 121 } | 135 } |
| 122 | 136 |
| 123 base::android::ScopedJavaLocalRef<jobject> JniClient::NewBitmap(int width, | |
| 124 int height) { | |
| 125 JNIEnv* env = base::android::AttachCurrentThread(); | |
| 126 return Java_Client_newBitmap(env, width, height); | |
| 127 } | |
| 128 | |
| 129 void JniClient::UpdateFrameBitmap(jobject bitmap) { | |
| 130 DCHECK(runtime()->display_task_runner()->BelongsToCurrentThread()); | |
| 131 | |
| 132 JNIEnv* env = base::android::AttachCurrentThread(); | |
| 133 Java_Client_setVideoFrame(env, java_client_, bitmap); | |
| 134 } | |
| 135 | |
| 136 void JniClient::UpdateCursorShape( | |
| 137 const protocol::CursorShapeInfo& cursor_shape) { | |
| 138 DCHECK(runtime()->display_task_runner()->BelongsToCurrentThread()); | |
| 139 | |
| 140 // const_cast<> is safe as long as the Java updateCursorShape() method copies | |
| 141 // the data out of the buffer without mutating it, and doesn't keep any | |
| 142 // reference to the buffer afterwards. Unfortunately, there seems to be no way | |
| 143 // to create a read-only ByteBuffer from a pointer-to-const. | |
| 144 char* data = string_as_array(const_cast<std::string*>(&cursor_shape.data())); | |
| 145 int cursor_total_bytes = | |
| 146 cursor_shape.width() * cursor_shape.height() * kBytesPerPixel; | |
| 147 | |
| 148 JNIEnv* env = base::android::AttachCurrentThread(); | |
| 149 base::android::ScopedJavaLocalRef<jobject> buffer( | |
| 150 env, env->NewDirectByteBuffer(data, cursor_total_bytes)); | |
| 151 Java_Client_updateCursorShape(env, java_client_, cursor_shape.width(), | |
| 152 cursor_shape.height(), cursor_shape.hotspot_x(), | |
| 153 cursor_shape.hotspot_y(), buffer.obj()); | |
| 154 } | |
| 155 | |
| 156 void JniClient::RedrawCanvas() { | |
| 157 DCHECK(runtime()->display_task_runner()->BelongsToCurrentThread()); | |
| 158 | |
| 159 JNIEnv* env = base::android::AttachCurrentThread(); | |
| 160 Java_Client_redrawGraphicsInternal(env, java_client_); | |
| 161 } | |
| 162 | |
| 163 // static | 137 // static |
| 164 bool JniClient::RegisterJni(JNIEnv* env) { | 138 bool JniClient::RegisterJni(JNIEnv* env) { |
| 165 return RegisterNativesImpl(env); | 139 return RegisterNativesImpl(env); |
| 166 } | 140 } |
| 167 | 141 |
| 168 void JniClient::Connect( | 142 void JniClient::Connect( |
| 169 JNIEnv* env, | 143 JNIEnv* env, |
| 170 const base::android::JavaParamRef<jobject>& caller, | 144 const base::android::JavaParamRef<jobject>& caller, |
| 145 jlong display_handler, |
| 171 const base::android::JavaParamRef<jstring>& username, | 146 const base::android::JavaParamRef<jstring>& username, |
| 172 const base::android::JavaParamRef<jstring>& authToken, | 147 const base::android::JavaParamRef<jstring>& authToken, |
| 173 const base::android::JavaParamRef<jstring>& hostJid, | 148 const base::android::JavaParamRef<jstring>& hostJid, |
| 174 const base::android::JavaParamRef<jstring>& hostId, | 149 const base::android::JavaParamRef<jstring>& hostId, |
| 175 const base::android::JavaParamRef<jstring>& hostPubkey, | 150 const base::android::JavaParamRef<jstring>& hostPubkey, |
| 176 const base::android::JavaParamRef<jstring>& pairId, | 151 const base::android::JavaParamRef<jstring>& pairId, |
| 177 const base::android::JavaParamRef<jstring>& pairSecret, | 152 const base::android::JavaParamRef<jstring>& pairSecret, |
| 178 const base::android::JavaParamRef<jstring>& capabilities, | 153 const base::android::JavaParamRef<jstring>& capabilities, |
| 179 const base::android::JavaParamRef<jstring>& flags) { | 154 const base::android::JavaParamRef<jstring>& flags) { |
| 180 ConnectToHost(ConvertJavaStringToUTF8(env, username), | 155 JniDisplayHandler* raw_handler = reinterpret_cast<JniDisplayHandler*>( |
| 156 display_handler); |
| 157 DCHECK(raw_handler); |
| 158 ConnectToHost(raw_handler->GetWeakPtr(), |
| 159 ConvertJavaStringToUTF8(env, username), |
| 181 ConvertJavaStringToUTF8(env, authToken), | 160 ConvertJavaStringToUTF8(env, authToken), |
| 182 ConvertJavaStringToUTF8(env, hostJid), | 161 ConvertJavaStringToUTF8(env, hostJid), |
| 183 ConvertJavaStringToUTF8(env, hostId), | 162 ConvertJavaStringToUTF8(env, hostId), |
| 184 ConvertJavaStringToUTF8(env, hostPubkey), | 163 ConvertJavaStringToUTF8(env, hostPubkey), |
| 185 ConvertJavaStringToUTF8(env, pairId), | 164 ConvertJavaStringToUTF8(env, pairId), |
| 186 ConvertJavaStringToUTF8(env, pairSecret), | 165 ConvertJavaStringToUTF8(env, pairSecret), |
| 187 ConvertJavaStringToUTF8(env, capabilities), | 166 ConvertJavaStringToUTF8(env, capabilities), |
| 188 ConvertJavaStringToUTF8(env, flags)); | 167 ConvertJavaStringToUTF8(env, flags)); |
| 189 } | 168 } |
| 190 | 169 |
| 191 void JniClient::Disconnect(JNIEnv* env, | 170 void JniClient::Disconnect(JNIEnv* env, |
| 192 const base::android::JavaParamRef<jobject>& caller) { | 171 const base::android::JavaParamRef<jobject>& caller) { |
| 193 DisconnectFromHost(); | 172 DisconnectFromHost(); |
| 194 } | 173 } |
| 195 | 174 |
| 196 void JniClient::AuthenticationResponse( | 175 void JniClient::AuthenticationResponse( |
| 197 JNIEnv* env, | 176 JNIEnv* env, |
| 198 const JavaParamRef<jobject>& caller, | 177 const JavaParamRef<jobject>& caller, |
| 199 const JavaParamRef<jstring>& pin, | 178 const JavaParamRef<jstring>& pin, |
| 200 jboolean createPair, | 179 jboolean createPair, |
| 201 const JavaParamRef<jstring>& deviceName) { | 180 const JavaParamRef<jstring>& deviceName) { |
| 202 session_->ProvideSecret(ConvertJavaStringToUTF8(env, pin).c_str(), createPair, | 181 session_->ProvideSecret(ConvertJavaStringToUTF8(env, pin).c_str(), createPair, |
| 203 ConvertJavaStringToUTF8(env, deviceName)); | 182 ConvertJavaStringToUTF8(env, deviceName)); |
| 204 } | 183 } |
| 205 | 184 |
| 206 void JniClient::ScheduleRedraw( | |
| 207 JNIEnv* env, | |
| 208 const base::android::JavaParamRef<jobject>& caller) { | |
| 209 session_->RedrawDesktop(); | |
| 210 } | |
| 211 | |
| 212 void JniClient::SendMouseEvent( | 185 void JniClient::SendMouseEvent( |
| 213 JNIEnv* env, | 186 JNIEnv* env, |
| 214 const base::android::JavaParamRef<jobject>& caller, | 187 const base::android::JavaParamRef<jobject>& caller, |
| 215 jint x, | 188 jint x, |
| 216 jint y, | 189 jint y, |
| 217 jint whichButton, | 190 jint whichButton, |
| 218 jboolean buttonDown) { | 191 jboolean buttonDown) { |
| 219 // Button must be within the bounds of the MouseEvent_MouseButton enum. | 192 // Button must be within the bounds of the MouseEvent_MouseButton enum. |
| 220 DCHECK(whichButton >= 0 && whichButton < 5); | 193 DCHECK(whichButton >= 0 && whichButton < 5); |
| 221 | 194 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 const base::android::JavaParamRef<jobject>& caller, | 252 const base::android::JavaParamRef<jobject>& caller, |
| 280 jboolean enable) { | 253 jboolean enable) { |
| 281 session_->EnableVideoChannel(enable); | 254 session_->EnableVideoChannel(enable); |
| 282 } | 255 } |
| 283 | 256 |
| 284 void JniClient::OnThirdPartyTokenFetched( | 257 void JniClient::OnThirdPartyTokenFetched( |
| 285 JNIEnv* env, | 258 JNIEnv* env, |
| 286 const base::android::JavaParamRef<jobject>& caller, | 259 const base::android::JavaParamRef<jobject>& caller, |
| 287 const JavaParamRef<jstring>& token, | 260 const JavaParamRef<jstring>& token, |
| 288 const JavaParamRef<jstring>& shared_secret) { | 261 const JavaParamRef<jstring>& shared_secret) { |
| 289 runtime()->network_task_runner()->PostTask( | 262 runtime_->network_task_runner()->PostTask( |
| 290 FROM_HERE, | 263 FROM_HERE, |
| 291 base::Bind(&ChromotingJniInstance::HandleOnThirdPartyTokenFetched, | 264 base::Bind(&ChromotingJniInstance::HandleOnThirdPartyTokenFetched, |
| 292 session_, ConvertJavaStringToUTF8(env, token), | 265 session_->GetWeakPtr(), ConvertJavaStringToUTF8(env, token), |
| 293 ConvertJavaStringToUTF8(env, shared_secret))); | 266 ConvertJavaStringToUTF8(env, shared_secret))); |
| 294 } | 267 } |
| 295 | 268 |
| 296 void JniClient::SendExtensionMessage( | 269 void JniClient::SendExtensionMessage( |
| 297 JNIEnv* env, | 270 JNIEnv* env, |
| 298 const base::android::JavaParamRef<jobject>& caller, | 271 const base::android::JavaParamRef<jobject>& caller, |
| 299 const JavaParamRef<jstring>& type, | 272 const JavaParamRef<jstring>& type, |
| 300 const JavaParamRef<jstring>& data) { | 273 const JavaParamRef<jstring>& data) { |
| 301 session_->SendClientMessage(ConvertJavaStringToUTF8(env, type), | 274 session_->SendClientMessage(ConvertJavaStringToUTF8(env, type), |
| 302 ConvertJavaStringToUTF8(env, data)); | 275 ConvertJavaStringToUTF8(env, data)); |
| 303 } | 276 } |
| 304 | 277 |
| 305 void JniClient::Destroy(JNIEnv* env, const JavaParamRef<jobject>& caller) { | 278 void JniClient::Destroy(JNIEnv* env, const JavaParamRef<jobject>& caller) { |
| 306 // The session must be shut down first, since it depends on our other | |
| 307 // components' still being alive. | |
| 308 DisconnectFromHost(); | |
| 309 | |
| 310 env->DeleteGlobalRef(java_client_); | |
| 311 delete this; | 279 delete this; |
| 312 } | 280 } |
| 313 | 281 |
| 314 base::WeakPtr<JniClient> JniClient::GetWeakPtr() { | 282 base::WeakPtr<JniClient> JniClient::GetWeakPtr() { |
| 315 return weak_factory_.GetWeakPtr(); | 283 return weak_factory_.GetWeakPtr(); |
| 316 } | 284 } |
| 317 | 285 |
| 318 // static | |
| 319 ChromotingJniRuntime* JniClient::runtime() { | |
| 320 return ChromotingJniRuntime::GetInstance(); | |
| 321 } | |
| 322 | |
| 323 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& caller) { | 286 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& caller) { |
| 324 jobject caller_ref = env->NewGlobalRef(caller); | 287 return reinterpret_cast<intptr_t>( |
| 325 return reinterpret_cast<intptr_t>(new JniClient(caller_ref)); | 288 new JniClient(ChromotingJniRuntime::GetInstance(), |
| 289 base::android::ScopedJavaGlobalRef<jobject>(env, caller))); |
| 326 } | 290 } |
| 327 | 291 |
| 328 } // namespace remoting | 292 } // namespace remoting |
| OLD | NEW |