Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2014 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 | |
| 5 #include "mojo/system/android/core_impl.h" | |
| 6 | |
| 7 #include "base/android/base_jni_registrar.h" | |
| 8 #include "base/android/jni_android.h" | |
| 9 #include "base/android/jni_registrar.h" | |
| 10 #include "base/android/library_loader/library_loader_hooks.h" | |
| 11 #include "base/logging.h" | |
| 12 #include "jni/CoreImpl_jni.h" | |
| 13 #include "mojo/embedder/embedder.h" | |
| 14 #include "mojo/public/c/system/core.h" | |
| 15 | |
| 16 namespace mojo { | |
| 17 namespace android { | |
| 18 | |
| 19 static void Constructor(JNIEnv* env, jobject jcaller) { | |
| 20 mojo::embedder::Init(); | |
| 21 } | |
| 22 | |
| 23 static jlong GetTimeTicksNow(JNIEnv* env, jobject jcaller) { | |
| 24 return MojoGetTimeTicksNow(); | |
| 25 } | |
| 26 | |
| 27 static jint WaitMany(JNIEnv* env, | |
| 28 jobject jcaller, | |
| 29 jobject buffer, | |
| 30 jlong deadline) { | |
| 31 // Buffer contains first the list of handles, then the list of flags. | |
| 32 const void* buffer_start = env->GetDirectBufferAddress(buffer); | |
| 33 DCHECK(buffer_start); | |
| 34 const size_t record_size = 8; | |
| 35 const size_t buffer_size = env->GetDirectBufferCapacity(buffer); | |
| 36 DCHECK_EQ(buffer_size % record_size, 0u); | |
| 37 | |
| 38 const size_t nb_handles = buffer_size / record_size; | |
| 39 const MojoHandle* handle_start = static_cast<const MojoHandle*>(buffer_start); | |
| 40 const MojoWaitFlags* flagsStart = | |
|
bulach
2014/04/17 13:15:42
nit: flag_start
qsr
2014/04/17 13:50:24
Done.
| |
| 41 static_cast<const MojoWaitFlags*>(handle_start + nb_handles); | |
| 42 return MojoWaitMany(handle_start, flagsStart, nb_handles, deadline); | |
| 43 } | |
| 44 | |
| 45 static jobject CreateMessagePipe(JNIEnv* env, jobject jcaller) { | |
| 46 MojoHandle handle1; | |
| 47 MojoHandle handle2; | |
| 48 MojoResult result = MojoCreateMessagePipe(&handle1, &handle2); | |
| 49 return Java_CoreImpl_newNativeCreationResult(env, result, handle1, handle2) | |
| 50 .Release(); | |
| 51 } | |
| 52 | |
| 53 static jobject CreateDataPipe(JNIEnv* env, | |
| 54 jobject jcaller, | |
| 55 jobject options_buffer) { | |
| 56 const MojoCreateDataPipeOptions* options = NULL; | |
| 57 if (options_buffer) { | |
| 58 const void* buffer_start = env->GetDirectBufferAddress(options_buffer); | |
| 59 DCHECK(buffer_start); | |
| 60 const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer); | |
| 61 DCHECK_EQ(buffer_size, sizeof(MojoCreateDataPipeOptions)); | |
| 62 options = static_cast<const MojoCreateDataPipeOptions*>(buffer_start); | |
| 63 DCHECK_EQ(options->struct_size, buffer_size); | |
| 64 } | |
| 65 MojoHandle handle1; | |
| 66 MojoHandle handle2; | |
| 67 MojoResult result = MojoCreateDataPipe(options, &handle1, &handle2); | |
| 68 return Java_CoreImpl_newNativeCreationResult(env, result, handle1, handle2) | |
| 69 .Release(); | |
| 70 } | |
| 71 | |
| 72 static jobject CreateSharedBuffer(JNIEnv* env, | |
| 73 jobject jcaller, | |
| 74 jobject options_buffer, | |
| 75 jlong num_bytes) { | |
| 76 const MojoCreateSharedBufferOptions* options = 0; | |
| 77 if (options_buffer) { | |
| 78 const void* buffer_start = env->GetDirectBufferAddress(options_buffer); | |
| 79 DCHECK(buffer_start); | |
| 80 const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer); | |
| 81 DCHECK_EQ(buffer_size, sizeof(MojoCreateSharedBufferOptions)); | |
| 82 options = static_cast<const MojoCreateSharedBufferOptions*>(buffer_start); | |
| 83 DCHECK_EQ(options->struct_size, buffer_size); | |
| 84 } | |
| 85 MojoHandle handle; | |
| 86 MojoResult result = MojoCreateSharedBuffer(options, num_bytes, &handle); | |
| 87 return Java_CoreImpl_newNativeCreationResult(env, result, handle, 0) | |
| 88 .Release(); | |
| 89 } | |
| 90 | |
| 91 static jint Close(JNIEnv* env, jobject jcaller, jint mojo_handle) { | |
| 92 return MojoClose(mojo_handle); | |
| 93 } | |
| 94 | |
| 95 static jint Wait(JNIEnv* env, | |
| 96 jobject jcaller, | |
| 97 jint mojo_handle, | |
| 98 jint flags, | |
| 99 jlong deadline) { | |
| 100 return MojoWait(mojo_handle, flags, deadline); | |
| 101 } | |
| 102 | |
| 103 static jint WriteMessage(JNIEnv* env, | |
| 104 jobject jcaller, | |
| 105 jint mojo_handle, | |
| 106 jobject bytes, | |
| 107 jint num_bytes, | |
| 108 jobject handles_buffer, | |
| 109 jint flags) { | |
| 110 const void* buffer_start = 0; | |
| 111 uint32_t buffer_size = 0; | |
| 112 if (bytes) { | |
| 113 buffer_start = env->GetDirectBufferAddress(bytes); | |
| 114 DCHECK(buffer_start); | |
| 115 DCHECK(env->GetDirectBufferCapacity(bytes) >= num_bytes); | |
| 116 buffer_size = num_bytes; | |
| 117 } | |
| 118 const MojoHandle* handles = 0; | |
| 119 uint32_t num_handles = 0; | |
| 120 if (handles_buffer) { | |
| 121 handles = | |
| 122 static_cast<MojoHandle*>(env->GetDirectBufferAddress(handles_buffer)); | |
| 123 num_handles = env->GetDirectBufferCapacity(handles_buffer) / 4; | |
| 124 } | |
| 125 // Java code will handle invalidating handles if the write succeeded. | |
| 126 return MojoWriteMessage( | |
| 127 mojo_handle, buffer_start, buffer_size, handles, num_handles, flags); | |
| 128 } | |
| 129 | |
| 130 static jobject ReadMessage(JNIEnv* env, | |
| 131 jobject jcaller, | |
| 132 jint mojo_handle, | |
| 133 jobject bytes, | |
| 134 jobject handles_buffer, | |
| 135 jint flags) { | |
| 136 void* buffer_start = 0; | |
| 137 uint32_t buffer_size = 0; | |
| 138 if (bytes) { | |
| 139 buffer_start = env->GetDirectBufferAddress(bytes); | |
| 140 DCHECK(buffer_start); | |
| 141 buffer_size = env->GetDirectBufferCapacity(bytes); | |
| 142 } | |
| 143 MojoHandle* handles = 0; | |
| 144 uint32_t num_handles = 0; | |
| 145 if (handles_buffer) { | |
| 146 handles = | |
| 147 static_cast<MojoHandle*>(env->GetDirectBufferAddress(handles_buffer)); | |
| 148 num_handles = env->GetDirectBufferCapacity(handles_buffer) / 4; | |
| 149 } | |
| 150 MojoResult result = MojoReadMessage( | |
| 151 mojo_handle, buffer_start, &buffer_size, handles, &num_handles, flags); | |
| 152 // Jave code will handle taking ownership of any received handle. | |
| 153 return Java_CoreImpl_newNativeReadMessageResult( | |
| 154 env, result, buffer_size, num_handles).Release(); | |
| 155 } | |
| 156 | |
| 157 static jint ReadData(JNIEnv* env, | |
| 158 jobject jcaller, | |
| 159 jint mojo_handle, | |
| 160 jobject elements, | |
| 161 jint elements_capacity, | |
| 162 jint flags) { | |
| 163 void* buffer_start = 0; | |
| 164 uint32_t buffer_size = elements_capacity; | |
| 165 if (elements) { | |
| 166 buffer_start = env->GetDirectBufferAddress(elements); | |
| 167 DCHECK(buffer_start); | |
| 168 DCHECK(elements_capacity <= env->GetDirectBufferCapacity(elements)); | |
| 169 } | |
| 170 MojoResult result = | |
| 171 MojoReadData(mojo_handle, buffer_start, &buffer_size, flags); | |
| 172 if (result < 0) { | |
| 173 return result; | |
| 174 } | |
| 175 return buffer_size; | |
| 176 } | |
| 177 | |
| 178 static jobject BeginReadData(JNIEnv* env, | |
| 179 jobject jcaller, | |
| 180 jint mojo_handle, | |
| 181 jint num_bytes, | |
| 182 jint flags) { | |
| 183 void const* buffer = 0; | |
| 184 uint32_t buffer_size = num_bytes; | |
| 185 MojoResult result = | |
| 186 MojoBeginReadData(mojo_handle, &buffer, &buffer_size, flags); | |
| 187 jobject byte_buffer = 0; | |
| 188 if (result == MOJO_RESULT_OK) { | |
| 189 byte_buffer = | |
| 190 env->NewDirectByteBuffer(const_cast<void*>(buffer), buffer_size); | |
| 191 } | |
| 192 return Java_CoreImpl_newNativeCodeAndBufferResult(env, result, byte_buffer) | |
| 193 .Release(); | |
| 194 } | |
| 195 | |
| 196 static jint EndReadData(JNIEnv* env, | |
| 197 jobject jcaller, | |
| 198 jint mojo_handle, | |
| 199 jint num_bytes_read) { | |
| 200 return MojoEndReadData(mojo_handle, num_bytes_read); | |
| 201 } | |
| 202 | |
| 203 static jint WriteData(JNIEnv* env, | |
| 204 jobject jcaller, | |
| 205 jint mojo_handle, | |
| 206 jobject elements, | |
| 207 jint limit, | |
| 208 jint flags) { | |
| 209 void* buffer_start = env->GetDirectBufferAddress(elements); | |
| 210 DCHECK(buffer_start); | |
| 211 DCHECK(limit <= env->GetDirectBufferCapacity(elements)); | |
| 212 uint32_t buffer_size = limit; | |
| 213 MojoResult result = | |
| 214 MojoWriteData(mojo_handle, buffer_start, &buffer_size, flags); | |
| 215 if (result < 0) { | |
| 216 return result; | |
| 217 } | |
| 218 return buffer_size; | |
| 219 } | |
| 220 | |
| 221 static jobject BeginWriteData(JNIEnv* env, | |
| 222 jobject jcaller, | |
| 223 jint mojo_handle, | |
| 224 jint num_bytes, | |
| 225 jint flags) { | |
| 226 void* buffer = 0; | |
| 227 uint32_t buffer_size = num_bytes; | |
| 228 MojoResult result = | |
| 229 MojoBeginWriteData(mojo_handle, &buffer, &buffer_size, flags); | |
| 230 jobject byte_buffer = 0; | |
| 231 if (result == MOJO_RESULT_OK) { | |
| 232 byte_buffer = env->NewDirectByteBuffer(buffer, buffer_size); | |
| 233 } | |
| 234 return Java_CoreImpl_newNativeCodeAndBufferResult(env, result, byte_buffer) | |
| 235 .Release(); | |
| 236 } | |
| 237 | |
| 238 static jint EndWriteData(JNIEnv* env, | |
| 239 jobject jcaller, | |
| 240 jint mojo_handle, | |
| 241 jint num_bytes_written) { | |
| 242 return MojoEndWriteData(mojo_handle, num_bytes_written); | |
| 243 } | |
| 244 | |
| 245 static jobject Duplicate(JNIEnv* env, | |
| 246 jobject jcaller, | |
| 247 jint mojo_handle, | |
| 248 jobject options_buffer) { | |
| 249 const MojoDuplicateBufferHandleOptions* options = 0; | |
| 250 if (options_buffer) { | |
| 251 const void* buffer_start = env->GetDirectBufferAddress(options_buffer); | |
| 252 DCHECK(buffer_start); | |
| 253 const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer); | |
| 254 DCHECK_EQ(buffer_size, sizeof(MojoDuplicateBufferHandleOptions)); | |
| 255 options = | |
| 256 static_cast<const MojoDuplicateBufferHandleOptions*>(buffer_start); | |
| 257 DCHECK_EQ(options->struct_size, buffer_size); | |
| 258 } | |
| 259 MojoHandle handle; | |
| 260 MojoResult result = MojoDuplicateBufferHandle(mojo_handle, options, &handle); | |
| 261 return Java_CoreImpl_newNativeCreationResult(env, result, handle, 0) | |
| 262 .Release(); | |
| 263 } | |
| 264 | |
| 265 static jobject Map(JNIEnv* env, | |
| 266 jobject jcaller, | |
| 267 jint mojo_handle, | |
| 268 jlong offset, | |
| 269 jlong num_bytes, | |
| 270 jint flags) { | |
| 271 void* buffer = 0; | |
| 272 MojoResult result = | |
| 273 MojoMapBuffer(mojo_handle, offset, num_bytes, &buffer, flags); | |
| 274 jobject byte_buffer = 0; | |
| 275 if (result == MOJO_RESULT_OK) { | |
| 276 byte_buffer = env->NewDirectByteBuffer(buffer, num_bytes); | |
| 277 } | |
| 278 return Java_CoreImpl_newNativeCodeAndBufferResult(env, result, byte_buffer) | |
| 279 .Release(); | |
| 280 } | |
| 281 | |
| 282 static int Unmap(JNIEnv* env, jobject jcaller, jobject buffer) { | |
| 283 void* buffer_start = env->GetDirectBufferAddress(buffer); | |
| 284 DCHECK(buffer_start); | |
| 285 return MojoUnmapBuffer(buffer_start); | |
| 286 } | |
| 287 | |
| 288 bool RegisterCoreImpl(JNIEnv* env) { | |
| 289 return RegisterNativesImpl(env); | |
| 290 } | |
| 291 | |
| 292 } // namespace android | |
| 293 } // namespace mojo | |
| OLD | NEW |