Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(242)

Side by Side Diff: runtime/bin/main_android.cc

Issue 11362103: Rotating spheres sample (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: More cleanup Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/bin/main.cc ('k') | runtime/platform/assert.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 #include <jni.h>
6 #include <stddef.h>
7 #include <string.h>
8
9 #include <android/log.h>
10
11 #include <dart_api.h>
12
13 #define LOGX(LOG_LEVEL, ...) do { \
14 __android_log_print(LOG_LEVEL, LOG_TAG, __VA_ARGS__); \
15 } while (0)
16 #define LOGI(...) LOGX(ANDROID_LOG_INFO, __VA_ARGS__)
17 #define LOGW(...) LOGX(ANDROID_LOG_WARN, __VA_ARGS__)
18 #define LOGE(...) LOGX(ANDROID_LOG_ERROR, __VA_ARGS__)
19
20 int registerNativeMethods(JNIEnv* env, const char* className,
21 JNINativeMethod* gMethods, int numMethods);
22
23 // Provide atexit, not part of Android libc or linker.
24
25 extern "C" int atexit(void (*function)(void)) {
26 // Return error code.
27 return 1;
28 }
29
30 // Provide __dso_handle, not part of Android libc or linker.
31
32 __attribute__((weak)) void *__dso_handle;
33
34 extern "C" int Dart_SO_Start(int argc, const char** argv,
35 Dart_Isolate* main_isolate);
36 extern "C" int Dart_SO_MainLoop(Dart_Isolate main_isolate);
37 extern "C" int Dart_SO_Finish(Dart_Isolate main_isolate);
38
39 inline Dart_Handle JINT_TO_DART_HANDLE(jint X) {
40 return reinterpret_cast<Dart_Handle>(X);
41 }
42
43 inline jint DART_HANDLE_TO_JINT(Dart_Handle X) {
44 return reinterpret_cast<jint>(X);
45 }
46
47 inline Dart_Isolate JINT_TO_DART_ISOLATE(jint X) {
48 return reinterpret_cast<Dart_Isolate>(X);
49 }
50
51 inline jint DART_ISOLATE_TO_JINT(Dart_Isolate X) {
52 return reinterpret_cast<jint>(X);
53 }
54
55 #define LOG_TAG "dart_so"
56
57 /*
58 * Class: org_dartlang_Dart
59 * Method: dartStart
60 * Signature: ([Ljava/lang/String;)I
61 */
62 static jint dartStart(JNIEnv *env, jclass clazz, jobjectArray args) {
63 int argc = env->GetArrayLength(args);
64 const char** argv = new const char*[argc];
65
66 for (int i = 0; i < argc; i++) {
67 jstring string = (jstring) env->GetObjectArrayElement(args, i);
68 argv[i] = env->GetStringUTFChars(string, 0);
69 }
70
71 LOGI("argc: %d", argc);
72
73 for (int i = 0; i < argc; i++) {
74 LOGI("%d: %s", i, argv[i]);
75 }
76
77 Dart_Isolate main_isolate;
78 int result = Dart_SO_Start(argc, argv, &main_isolate);
79 if (result != 0) {
80 LOGE("Dart_SO_Start returned %d", result);
81 main_isolate = (Dart_Isolate) 0;
82 }
83
84 for (int i = 0; i < argc; i++) {
85 jstring string = (jstring) env->GetObjectArrayElement(args, i);
86 env->ReleaseStringUTFChars(string, argv[i]);
87 }
88 delete[] argv;
89 return DART_ISOLATE_TO_JINT(main_isolate);
90 }
91
92 /*
93 * Class: org_dartlang_Dart
94 * Method: dartFinish
95 * Signature: (I)I
96 */
97 static jint dartFinish(JNIEnv* env, jclass clazz, jint main_isolate) {
98 return Dart_SO_Finish(JINT_TO_DART_ISOLATE(main_isolate));
99 }
100
101 /*
102 * Class: org_dartlang_Dart
103 * Method: IsError
104 * Signature: (I)Z
105 */
106 static jboolean IsError(JNIEnv* env, jclass clazz, jint handle) {
107 return Dart_IsError(JINT_TO_DART_HANDLE(handle));
108 }
109
110 /*
111 * Class: org_dartlang_Dart
112 * Method: IsApiError
113 * Signature: (I)Z
114 */
115 static jboolean IsApiError
116 (JNIEnv* env, jclass clazz, jint handle) {
117 return Dart_IsApiError(JINT_TO_DART_HANDLE(handle));
118 }
119
120 /*
121 * Class: org_dartlang_Dart
122 * Method: IsUnhandledExceptionError
123 * Signature: (I)Z
124 */
125 static jboolean IsUnhandledExceptionError
126 (JNIEnv* env, jclass clazz, jint handle) {
127 return Dart_IsUnhandledExceptionError(JINT_TO_DART_HANDLE(handle));
128 }
129
130 /*
131 * Class: org_dartlang_Dart
132 * Method: IsCompilationError
133 * Signature: (I)Z
134 */
135 static jboolean IsCompilationError
136 (JNIEnv* env, jclass clazz, jint handle) {
137 return Dart_IsCompilationError(JINT_TO_DART_HANDLE(handle));
138 }
139
140 /*
141 * Class: org_dartlang_Dart
142 * Method: IsFatalError
143 * Signature: (I)Z
144 */
145 static jboolean IsFatalError
146 (JNIEnv* env, jclass clazz, jint handle) {
147 return Dart_IsFatalError(JINT_TO_DART_HANDLE(handle));
148 }
149
150 /*
151 * Class: org_dartlang_Dart
152 * Method: GetError
153 * Signature: (I)Ljava/lang/String;
154 */
155 static jstring GetError(JNIEnv* env, jclass clazz, jint handle) {
156 // N.B. the error string from Dart_GetError is good until Dart_ExitScope()
157 const char* error = Dart_GetError(JINT_TO_DART_HANDLE(handle));
158 return env->NewStringUTF(error);
159 }
160
161 /*
162 * Class: org_dartlang_Dart
163 * Method: ErrorHasException
164 * Signature: (I)Z
165 */
166 static jboolean ErrorHasException(JNIEnv* env, jclass clazz, jint handle) {
167 return Dart_ErrorHasException(JINT_TO_DART_HANDLE(handle));
168 }
169
170 /*
171 * Class: org_dartlang_Dart
172 * Method: ErrorGetException
173 * Signature: (I)I
174 */
175 static jint ErrorGetException(JNIEnv* env, jclass clazz, jint handle) {
176 return DART_HANDLE_TO_JINT(
177 Dart_ErrorGetException(JINT_TO_DART_HANDLE(handle)));
178 }
179
180 /*
181 * Class: org_dartlang_Dart
182 * Method: ErrorGetStacktrace
183 * Signature: (I)I
184 */
185 static jint ErrorGetStacktrace(JNIEnv* env, jclass clazz, jint handle) {
186 return DART_HANDLE_TO_JINT(
187 Dart_ErrorGetStacktrace(JINT_TO_DART_HANDLE(handle)));
188 }
189
190 /*
191 * Class: org_dartlang_Dart
192 * Method: NewApiError
193 * Signature: (Ljava/lang/String;)I
194 */
195 static jint NewApiError(JNIEnv* env, jclass clazz, jstring message) {
196 const char* messageChars = env->GetStringUTFChars(message, 0);
197 int result = DART_HANDLE_TO_JINT(
198 Dart_NewApiError("%s", messageChars));
199 env->ReleaseStringUTFChars(message, messageChars);
200 return result;
201 }
202
203 /*
204 * Class: org_dartlang_Dart
205 * Method: EnterScope
206 * Signature: ()V
207 */
208 static void EnterScope(JNIEnv* env, jclass clazz) {
209 Dart_EnterScope();
210 }
211
212 /*
213 * Class: org_dartlang_Dart
214 * Method: ExitScope
215 * Signature: ()V
216 */
217 static void ExitScope(JNIEnv* env, jclass clazz) {
218 Dart_ExitScope();
219 }
220
221 /*
222 * Class: org_dartlang_Dart
223 * Method: ShutdownIsolate
224 * Signature: ()V
225 */
226 static void ShutdownIsolate(JNIEnv* env, jclass clazz) {
227 Dart_ShutdownIsolate();
228 }
229
230 /*
231 * Class: org_dartlang_Dart
232 * Method: CurrentIsolate
233 * Signature: ()I
234 */
235 static jint CurrentIsolate(JNIEnv* env, jclass clazz) {
236 return DART_ISOLATE_TO_JINT(Dart_CurrentIsolate());
237 }
238
239 /*
240 * Class: org_dartlang_Dart
241 * Method: EnterIsolate
242 * Signature: (I)V
243 */
244 static void EnterIsolate(JNIEnv* env, jclass clazz, jint isolate) {
245 Dart_EnterIsolate(JINT_TO_DART_ISOLATE(isolate));
246 }
247
248 /*
249 * Class: org_dartlang_Dart
250 * Method: ExitIsolate
251 * Signature: ()V
252 */
253 static void ExitIsolate(JNIEnv* env, jclass clazz) {
254 Dart_ExitIsolate();
255 }
256 /*
257 * Class: org_dartlang_Dart
258 * Method: RootLibrary
259 * Signature: ()I
260 */
261 static jint RootLibrary(JNIEnv* env, jclass clazz) {
262 return DART_HANDLE_TO_JINT(Dart_RootLibrary());
263 }
264
265 /*
266 * Class: org_dartlang_Dart
267 * Method: LoadLibrary
268 * Signature: (II)I
269 */
270 static jint LoadLibrary(JNIEnv* env, jclass clazz, jint url, jint source) {
271 return DART_HANDLE_TO_JINT(Dart_LoadLibrary(JINT_TO_DART_HANDLE(url),
272 JINT_TO_DART_HANDLE(source)));
273 }
274 /*
275 * Class: org_dartlang_Dart
276 * Method: LoadSource
277 * Signature: (III)I
278 */
279 static jint LoadSource(
280 JNIEnv* env, jclass clazz, jint library, jint url, jint source) {
281 return DART_HANDLE_TO_JINT(Dart_LoadSource(
282 JINT_TO_DART_HANDLE(library),
283 JINT_TO_DART_HANDLE(url),
284 JINT_TO_DART_HANDLE(source)));
285 }
286
287 /*
288 * Class: org_dartlang_Dart
289 * Method: New
290 * Signature: (II[I)I
291 */
292 static jint New(JNIEnv* env, jclass clazz,
293 jint dart_clazz, jint name, jintArray arguments) {
294 int argc = 0;
295 jint* carr = NULL;
296
297 if (arguments != NULL) {
298 argc = env->GetArrayLength(arguments);
299 }
300
301 if (argc != 0) {
302 carr = env->GetIntArrayElements(arguments, NULL);
303
304 if (carr == NULL) {
305 return 0; /* exception ocurred. */
306 }
307 }
308
309 Dart_Handle* argv = NULL;
310
311 if (argc != NULL) {
312 argv = new Dart_Handle[argc];
313 for (int i = 0; i < argc; i++) {
314 argv[i] = JINT_TO_DART_HANDLE(carr[i]);
315 }
316
317 env->ReleaseIntArrayElements(arguments, carr, 0);
318 }
319
320 jint result = DART_HANDLE_TO_JINT(Dart_New(
321 JINT_TO_DART_HANDLE(dart_clazz),
322 JINT_TO_DART_HANDLE(name),
323 argc, argv));
324 delete[] argv;
325 return result;
326 }
327
328 /*
329 * Class: org_dartlang_Dart
330 * Method: Invoke
331 * Signature: (II[I)I
332 */
333 static jint Invoke(JNIEnv* env, jclass clazz,
334 jint target, jint name, jintArray arguments) {
335 int argc = 0;
336 jint* carr = NULL;
337
338 if (arguments != NULL) {
339 argc = env->GetArrayLength(arguments);
340 }
341
342 if (argc != 0) {
343 carr = env->GetIntArrayElements(arguments, NULL);
344
345 if (carr == NULL) {
346 return 0; /* exception ocurred. */
347 }
348 }
349
350 Dart_Handle* argv = NULL;
351
352 if (argc != NULL) {
353 argv = new Dart_Handle[argc];
354 for (int i = 0; i < argc; i++) {
355 argv[i] = JINT_TO_DART_HANDLE(carr[i]);
356 }
357
358 env->ReleaseIntArrayElements(arguments, carr, 0);
359 }
360
361 jint result = DART_HANDLE_TO_JINT(Dart_Invoke(
362 JINT_TO_DART_HANDLE(target),
363 JINT_TO_DART_HANDLE(name),
364 argc, argv));
365 delete[] argv;
366 return result;
367 }
368
369 /*
370 * Class: org_dartlang_Dart
371 * Method: GetField
372 * Signature: (II)I
373 */
374 static jint GetField(JNIEnv* env, jclass clazz, jint container, jint name) {
375 return DART_HANDLE_TO_JINT(
376 Dart_GetField(
377 JINT_TO_DART_HANDLE(container),
378 JINT_TO_DART_HANDLE(name)));
379 }
380
381 /*
382 * Class: org_dartlang_Dart
383 * Method: SetField
384 * Signature: (III)I
385 */
386 static jint SetField(JNIEnv* env, jclass clazz, jint container, jint name,
387 jint value) {
388 return DART_HANDLE_TO_JINT(
389 Dart_SetField(
390 JINT_TO_DART_HANDLE(container),
391 JINT_TO_DART_HANDLE(name),
392 JINT_TO_DART_HANDLE(value)));
393 }
394
395 /*
396 * Class: org_dartlang_Dart
397 * Method: ToString
398 * Signature: (I)I
399 */
400 static jint ToString(JNIEnv* env, jclass clazz, jint object) {
401 return DART_HANDLE_TO_JINT(Dart_ToString(JINT_TO_DART_HANDLE(object)));
402 }
403
404 /*
405 * Class: org_dartlang_Dart
406 * Method: StringToJavaString
407 * Signature: (I)Ljava/lang/String;
408 */
409 static jstring StringToJavaString(JNIEnv* env, jclass clazz, jint str) {
410 const uint8_t* bytes = 0;
411 int length = 0;
412 Dart_Handle result = Dart_StringToBytes(JINT_TO_DART_HANDLE(str),
413 & bytes, &length);
414 if (Dart_IsError(result)) {
415 return NULL;
416 }
417 // Make a copy that is null terminated.
418 char* buf = new char[length + 1];
419 memcpy(buf, bytes, length);
420 buf[length] = 0;
421 jstring resultString = env->NewStringUTF(buf);
422 delete[] buf;
423 return resultString;
424 }
425
426 /*
427 * Class: org_dartlang_Dart
428 * Method: IdentityEquals
429 * Signature: (II)Z
430 */
431 static jboolean IdentityEquals(JNIEnv* env, jclass clazz,
432 jint obj1, jint obj2) {
433 return Dart_IdentityEquals(JINT_TO_DART_HANDLE(obj1),
434 JINT_TO_DART_HANDLE(obj2));
435 }
436
437 /*
438 * Class: org_dartlang_Dart
439 * Method: RunLoop
440 * Signature: ()I
441 */
442 static jint RunLoop(JNIEnv* env, jclass clazz) {
443 return DART_HANDLE_TO_JINT(Dart_RunLoop());
444 }
445
446 /*
447 * Class: org_dartlang_Dart
448 * Method: Null
449 * Signature: ()I
450 */
451 static jint Null(JNIEnv* env, jclass clazz) {
452 return DART_HANDLE_TO_JINT(Dart_Null());
453 }
454
455 /*
456 * Class: org_dartlang_Dart
457 * Method: IsNull
458 * Signature: (I)Z
459 */
460 static jboolean IsNull(JNIEnv* env, jclass clazz, jint object) {
461 return Dart_IsNull(JINT_TO_DART_HANDLE(object));
462 }
463
464 /*
465 * Class: org_dartlang_Dart
466 * Method: NewString
467 * Signature: (Ljava/lang/String;)I
468 */
469 static jint NewString(JNIEnv* env, jclass clazz, jstring str) {
470 const char* strUtf = env->GetStringUTFChars(str, 0);
471 int result = DART_HANDLE_TO_JINT(Dart_NewString(strUtf));
472 env->ReleaseStringUTFChars(str, strUtf);
473 return result;
474 }
475
476 /*
477 * Class: org_dartlang_Dart
478 * Method: NewInteger
479 * Signature: (J)I
480 */
481 static jint NewInteger(JNIEnv* env, jclass clazz, jlong value) {
482 int result = DART_HANDLE_TO_JINT(Dart_NewInteger(value));
483 return result;
484 }
485
486 /*
487 * Class: org_dartlang_Dart
488 * Method: NewBoolean
489 * Signature: (Z)I
490 */
491 static jint NewBoolean(JNIEnv* env, jclass clazz, jboolean value) {
492 int result = DART_HANDLE_TO_JINT(Dart_NewBoolean(value));
493 return result;
494 }
495
496 /*
497 * Class: org_dartlang_Dart
498 * Method: NewDouble
499 * Signature: (D)I
500 */
501 static jint NewDouble(JNIEnv* env, jclass clazz, jdouble value) {
502 int result = DART_HANDLE_TO_JINT(Dart_NewDouble(value));
503 return result;
504 }
505
506 /*
507 * Class: org_dartlang_Dart
508 * Method: NewList
509 * Signature: (I)I
510 */
511 static jint NewList(JNIEnv* env, jclass clazz, jint length) {
512 int result = DART_HANDLE_TO_JINT(Dart_NewList(length));
513 return result;
514 }
515
516 /*
517 * Class: org_dartlang_Dart
518 * Method: ListLength
519 * Signature: (I)I
520 */
521 static jint ListLength(JNIEnv* env, jclass clazz, jint list) {
522 intptr_t length;
523 Dart_Handle result = Dart_ListLength(JINT_TO_DART_HANDLE(list), &length);
524 if (Dart_IsError(result)) {
525 return -1;
526 }
527 return (jint) length;
528 }
529
530 /*
531 * Class: org_dartlang_Dart
532 * Method: ListGetAt
533 * Signature: (II)I
534 */
535 static jint ListGetAt(JNIEnv* env, jclass clazz, jint list, jint index) {
536 int result = DART_HANDLE_TO_JINT(
537 Dart_ListGetAt(JINT_TO_DART_HANDLE(list), index));
538 return result;
539 }
540
541 /*
542 * Class: org_dartlang_Dart
543 * Method: ListSetAt
544 * Signature: (III)I
545 */
546 static jint ListSetAt(JNIEnv* env, jclass clazz,
547 jint list, jint index, jint value) {
548 int result = DART_HANDLE_TO_JINT(
549 Dart_ListSetAt(JINT_TO_DART_HANDLE(list),
550 index,
551 JINT_TO_DART_HANDLE(value)));
552 return result;
553 }
554
555 static const char *classPathName = "org/dartlang/Dart";
556
557 #define JNI_ENTRY(NAME, SIG) {#NAME, SIG, reinterpret_cast<void*>(NAME)},
558
559 static JNINativeMethod method_table[] = {
560 JNI_ENTRY(IsError, "(I)Z")
561 JNI_ENTRY(IsApiError, "(I)Z")
562 JNI_ENTRY(IsUnhandledExceptionError, "(I)Z")
563 JNI_ENTRY(IsCompilationError, "(I)Z")
564 JNI_ENTRY(IsFatalError, "(I)Z")
565 JNI_ENTRY(GetError, "(I)Ljava/lang/String;")
566 JNI_ENTRY(ErrorHasException, "(I)Z")
567 JNI_ENTRY(ErrorGetException, "(I)I")
568 JNI_ENTRY(ErrorGetStacktrace, "(I)I")
569 JNI_ENTRY(NewApiError, "(Ljava/lang/String;)I")
570 JNI_ENTRY(EnterScope, "()V")
571 JNI_ENTRY(ExitScope, "()V")
572 JNI_ENTRY(ShutdownIsolate, "()V")
573 JNI_ENTRY(CurrentIsolate, "()I")
574 JNI_ENTRY(EnterIsolate, "(I)V")
575 JNI_ENTRY(ExitIsolate, "()V")
576 JNI_ENTRY(RootLibrary, "()I")
577 JNI_ENTRY(LoadLibrary, "(II)I")
578 JNI_ENTRY(LoadSource, "(III)I")
579 JNI_ENTRY(New, "(II[I)I")
580 JNI_ENTRY(Invoke, "(II[I)I")
581 JNI_ENTRY(GetField, "(II)I")
582 JNI_ENTRY(SetField, "(III)I")
583 JNI_ENTRY(ToString, "(I)I")
584 JNI_ENTRY(StringToJavaString, "(I)Ljava/lang/String;")
585 JNI_ENTRY(IdentityEquals, "(II)Z")
586 JNI_ENTRY(RunLoop, "()I")
587 JNI_ENTRY(Null, "()I")
588 JNI_ENTRY(IsNull, "(I)Z")
589 JNI_ENTRY(NewString, "(Ljava/lang/String;)I")
590 JNI_ENTRY(NewInteger, "(J)I")
591 JNI_ENTRY(NewBoolean, "(Z)I")
592 JNI_ENTRY(NewDouble, "(D)I")
593 JNI_ENTRY(NewList, "(I)I")
594 JNI_ENTRY(ListLength, "(I)I")
595 JNI_ENTRY(ListGetAt, "(II)I")
596 JNI_ENTRY(ListSetAt, "(III)I")
597
598 JNI_ENTRY(dartStart, "([Ljava/lang/String;)I")
599 JNI_ENTRY(dartFinish, "(I)I")
600 };
601
602 int init_Dart(JNIEnv *env) {
603 if (!registerNativeMethods(env, classPathName, method_table,
604 sizeof(method_table) / sizeof(method_table[0]))) {
605 return JNI_FALSE;
606 }
607
608 return JNI_TRUE;
609 }
610
611 /*
612 * Register several native methods for one class.
613 */
614 int registerNativeMethods(JNIEnv* env, const char* className,
615 JNINativeMethod* gMethods, int numMethods) {
616 jclass clazz;
617
618 clazz = env->FindClass(className);
619 if (clazz == NULL) {
620 LOGE("Native registration unable to find class '%s'", className);
621 return JNI_FALSE;
622 }
623 if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) {
624 LOGE("RegisterNatives failed for '%s'", className);
625 return JNI_FALSE;
626 }
627
628 return JNI_TRUE;
629 }
630
631 // ----------------------------------------------------------------------------
632
633 /*
634 * This is called by the VM when the shared library is first loaded.
635 */
636
637 typedef union {
638 JNIEnv* env;
639 void* venv;
640 } UnionJNIEnvToVoid;
641
642 extern "C"
643 jint JNI_OnLoad(JavaVM* vm, void* reserved) {
644 UnionJNIEnvToVoid uenv;
645 uenv.venv = NULL;
646 jint result = -1;
647 JNIEnv* env = NULL;
648
649 LOGI("JNI_OnLoad");
650
651 if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_4) != JNI_OK) {
652 LOGE("GetEnv");
653 goto bail;
654 }
655 env = uenv.env;
656
657 if (init_Dart(env) != JNI_TRUE) {
658 LOGE("init_Dart");
659 goto bail;
660 }
661
662 result = JNI_VERSION_1_4;
663
664 bail:
665 return result;
666 }
OLDNEW
« no previous file with comments | « runtime/bin/main.cc ('k') | runtime/platform/assert.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698