jni_runtime_delegate.cc 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // Copyright 2013 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "remoting/client/jni/jni_runtime_delegate.h"
  5. #include "base/android/jni_android.h"
  6. #include "base/android/jni_array.h"
  7. #include "base/android/jni_string.h"
  8. #include "base/android/library_loader/library_loader_hooks.h"
  9. #include "base/android/scoped_java_ref.h"
  10. #include "base/bind.h"
  11. #include "base/command_line.h"
  12. #include "base/memory/ptr_util.h"
  13. #include "base/memory/singleton.h"
  14. #include "base/synchronization/waitable_event.h"
  15. #include "base/task/thread_pool/thread_pool_instance.h"
  16. #include "remoting/android/jni_headers/JniInterface_jni.h"
  17. #include "remoting/base/chromium_url_request.h"
  18. #include "remoting/base/oauth_token_getter_proxy.h"
  19. #include "remoting/base/url_request_context_getter.h"
  20. #include "remoting/client/jni/jni_oauth_token_getter.h"
  21. #include "remoting/client/jni/jni_touch_event_data.h"
  22. using base::android::ConvertJavaStringToUTF8;
  23. using base::android::ConvertUTF8ToJavaString;
  24. using base::android::JavaParamRef;
  25. using base::android::ToJavaByteArray;
  26. namespace remoting {
  27. // Implementation of stubs defined in JniInterface_jni.h. These are the entry
  28. // points for JNI calls from Java into C++.
  29. static void JNI_JniInterface_LoadNative(JNIEnv* env) {
  30. base::CommandLine::Init(0, nullptr);
  31. // Create the singleton now so that the Chromoting threads will be set up.
  32. ChromotingClientRuntime* runtime =
  33. remoting::ChromotingClientRuntime::GetInstance();
  34. JniRuntimeDelegate* delegate = remoting::JniRuntimeDelegate::GetInstance();
  35. runtime->Init(delegate);
  36. }
  37. // JniRuntimeDelegate implementation.
  38. // static
  39. JniRuntimeDelegate* JniRuntimeDelegate::GetInstance() {
  40. return base::Singleton<JniRuntimeDelegate>::get();
  41. }
  42. JniRuntimeDelegate::JniRuntimeDelegate() {
  43. runtime_ = ChromotingClientRuntime::GetInstance();
  44. token_getter_ = std::make_unique<JniOAuthTokenGetter>();
  45. }
  46. JniRuntimeDelegate::~JniRuntimeDelegate() {
  47. runtime_ = nullptr;
  48. }
  49. void JniRuntimeDelegate::RuntimeWillShutdown() {
  50. DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
  51. base::WaitableEvent done_event(
  52. base::WaitableEvent::ResetPolicy::AUTOMATIC,
  53. base::WaitableEvent::InitialState::NOT_SIGNALED);
  54. runtime_->network_task_runner()->PostTask(
  55. FROM_HERE, base::BindOnce(&JniRuntimeDelegate::DetachFromVmAndSignal,
  56. base::Unretained(this), &done_event));
  57. done_event.Wait();
  58. runtime_->display_task_runner()->PostTask(
  59. FROM_HERE, base::BindOnce(&JniRuntimeDelegate::DetachFromVmAndSignal,
  60. base::Unretained(this), &done_event));
  61. done_event.Wait();
  62. }
  63. void JniRuntimeDelegate::RuntimeDidShutdown() {
  64. base::android::LibraryLoaderExitHook();
  65. base::android::DetachFromVM();
  66. }
  67. base::WeakPtr<OAuthTokenGetter> JniRuntimeDelegate::oauth_token_getter() {
  68. return token_getter_->GetWeakPtr();
  69. }
  70. void JniRuntimeDelegate::DetachFromVmAndSignal(base::WaitableEvent* waiter) {
  71. base::android::DetachFromVM();
  72. waiter->Signal();
  73. }
  74. } // namespace remoting