1 // Copyright (c) 2012 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.
5 #include "content/app/android/child_process_service.h"
7 #include <android/native_window_jni.h>
8 #include <cpu-features.h>
10 #include "base/android/jni_array.h"
11 #include "base/android/memory_pressure_listener_android.h"
12 #include "base/logging.h"
13 #include "base/posix/global_descriptors.h"
14 #include "content/child/child_thread.h"
15 #include "content/common/android/surface_texture_peer.h"
16 #include "content/common/gpu/gpu_surface_lookup.h"
17 #include "content/public/app/android_library_loader_hooks.h"
18 #include "content/public/common/content_descriptors.h"
19 #include "ipc/ipc_descriptors.h"
20 #include "jni/ChildProcessService_jni.h"
21 #include "ui/gl/android/scoped_java_surface.h"
23 using base::android::AttachCurrentThread
;
24 using base::android::CheckException
;
25 using base::android::JavaIntArrayToIntVector
;
31 class SurfaceTexturePeerChildImpl
: public content::SurfaceTexturePeer
,
32 public content::GpuSurfaceLookup
{
34 // |service| is the instance of
35 // org.chromium.content.app.ChildProcessService.
36 explicit SurfaceTexturePeerChildImpl(
37 const base::android::ScopedJavaLocalRef
<jobject
>& service
)
39 GpuSurfaceLookup::InitInstance(this);
42 virtual ~SurfaceTexturePeerChildImpl() {
43 GpuSurfaceLookup::InitInstance(NULL
);
46 virtual void EstablishSurfaceTexturePeer(
47 base::ProcessHandle pid
,
48 scoped_refptr
<gfx::SurfaceTexture
> surface_texture
,
50 int secondary_id
) OVERRIDE
{
51 JNIEnv
* env
= base::android::AttachCurrentThread();
52 content::Java_ChildProcessService_establishSurfaceTexturePeer(
53 env
, service_
.obj(), pid
,
54 surface_texture
->j_surface_texture().obj(), primary_id
,
59 virtual gfx::AcceleratedWidget
AcquireNativeWidget(int surface_id
) OVERRIDE
{
60 JNIEnv
* env
= base::android::AttachCurrentThread();
61 gfx::ScopedJavaSurface
surface(
62 content::Java_ChildProcessService_getViewSurface(
63 env
, service_
.obj(), surface_id
));
65 if (surface
.j_surface().is_null())
68 ANativeWindow
* native_window
= ANativeWindow_fromSurface(
69 env
, surface
.j_surface().obj());
75 // The instance of org.chromium.content.app.ChildProcessService.
76 base::android::ScopedJavaGlobalRef
<jobject
> service_
;
78 DISALLOW_COPY_AND_ASSIGN(SurfaceTexturePeerChildImpl
);
81 // Chrome actually uses the renderer code path for all of its child
82 // processes such as renderers, plugins, etc.
83 void InternalInitChildProcess(const std::vector
<int>& file_ids
,
84 const std::vector
<int>& file_fds
,
91 base::android::ScopedJavaLocalRef
<jobject
> service(env
, service_in
);
93 // Set the CPU properties.
94 android_setCpu(cpu_count
, cpu_features
);
95 // Register the file descriptors.
96 // This includes the IPC channel, the crash dump signals and resource related
98 DCHECK(file_fds
.size() == file_ids
.size());
99 for (size_t i
= 0; i
< file_ids
.size(); ++i
)
100 base::GlobalDescriptors::GetInstance()->Set(file_ids
[i
], file_fds
[i
]);
102 content::SurfaceTexturePeer::InitInstance(
103 new SurfaceTexturePeerChildImpl(service
));
105 base::android::MemoryPressureListenerAndroid::RegisterSystemCallback(env
);
108 } // namespace <anonymous>
110 void InitChildProcess(JNIEnv
* env
,
114 jintArray j_file_ids
,
115 jintArray j_file_fds
,
117 jlong cpu_features
) {
118 std::vector
<int> file_ids
;
119 std::vector
<int> file_fds
;
120 JavaIntArrayToIntVector(env
, j_file_ids
, &file_ids
);
121 JavaIntArrayToIntVector(env
, j_file_fds
, &file_fds
);
123 InternalInitChildProcess(
124 file_ids
, file_fds
, env
, clazz
, context
, service
,
125 cpu_count
, cpu_features
);
128 void ExitChildProcess(JNIEnv
* env
, jclass clazz
) {
129 LOG(INFO
) << "ChildProcessService: Exiting child process.";
130 LibraryLoaderExitHook();
134 bool RegisterChildProcessService(JNIEnv
* env
) {
135 return RegisterNativesImpl(env
);
138 void ShutdownMainThread(JNIEnv
* env
, jobject obj
) {
139 ChildThread::ShutdownThread();
142 } // namespace content