OLD | NEW |
(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 } |
OLD | NEW |