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