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

Unified Diff: samples/android_sample/jni/vm_glue.cc

Issue 11416343: Refactored Android samples / embedder. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix type error on playBackground 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « samples/android_sample/jni/vm_glue.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: samples/android_sample/jni/vm_glue.cc
diff --git a/samples/android_sample/jni/vm_glue.cc b/samples/android_sample/jni/vm_glue.cc
index a7a5bf7ef51476b3b6d6c7a17d24a734f98dac7d..483edc575f076f030a4ee87e72d5c423795230ae 100644
--- a/samples/android_sample/jni/vm_glue.cc
+++ b/samples/android_sample/jni/vm_glue.cc
@@ -1,215 +1,166 @@
-#include "jni/vm_glue.h"
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
#include <math.h>
+#include <stdio.h>
#include <unistd.h>
+#include <sys/stat.h>
-#include "bin/eventhandler.h"
-#include "bin/isolate_data.h"
-#include "bin/log.h"
-#include "bin/platform.h"
-#include "bin/process.h"
-#include "vm/flags.h"
+#include "include/dart_api.h"
+#include "jni/android_extension.h"
+#include "jni/log.h"
+#include "jni/vm_glue.h"
// snapshot_buffer points to a snapshot if we link in a snapshot otherwise
// it is initialized to NULL.
-extern const uint8_t* snapshot_buffer;
VMGlue::VMGlue(Graphics* graphics)
: graphics_(graphics),
isolate_(NULL),
initialized_vm_(false),
initialized_script_(false) {
- Log::Print("Creating VMGlue");
+ LOGI("Creating VMGlue");
}
int VMGlue::ErrorExit(const char* format, ...) {
va_list arguments;
va_start(arguments, format);
- Log::VPrintErr(format, arguments);
+ LOGE(format, arguments);
va_end(arguments);
Dart_ExitScope();
Dart_ShutdownIsolate();
- Log::PrintErr("Shutdown isolate");
+ LOGE("Shutdown isolate");
return -1;
}
-Dart_Handle VMGlue::SetupRuntimeOptions(CommandLineOptions* options,
- const char* executable_name,
- const char* script_name) {
- int options_count = 0;
- Dart_Handle dart_executable = DartUtils::NewString(executable_name);
- if (Dart_IsError(dart_executable)) {
- return dart_executable;
- }
- Dart_Handle dart_script = DartUtils::NewString(script_name);
- if (Dart_IsError(dart_script)) {
- return dart_script;
- }
- Dart_Handle dart_arguments = Dart_NewList(0);
- if (Dart_IsError(dart_arguments)) {
- return dart_arguments;
- }
- Dart_Handle core_lib_url = DartUtils::NewString("dart:core");
- if (Dart_IsError(core_lib_url)) {
- return core_lib_url;
- }
- Dart_Handle core_lib = Dart_LookupLibrary(core_lib_url);
- if (Dart_IsError(core_lib)) {
- return core_lib;
+Dart_Handle VMGlue::CheckError(Dart_Handle handle) {
+ if (Dart_IsError(handle)) {
+ LOGE("Unexpected Error Handle");
+ Dart_PropagateError(handle);
}
- Dart_Handle runtime_options_class_name =
- DartUtils::NewString("_OptionsImpl");
- if (Dart_IsError(runtime_options_class_name)) {
- return runtime_options_class_name;
- }
- Dart_Handle runtime_options_class = Dart_GetClass(
- core_lib, runtime_options_class_name);
- if (Dart_IsError(runtime_options_class)) {
- return runtime_options_class;
- }
- Dart_Handle executable_name_name = DartUtils::NewString("_nativeExecutable");
- if (Dart_IsError(executable_name_name)) {
- return executable_name_name;
- }
- Dart_Handle set_executable_name =
- Dart_SetField(runtime_options_class,
- executable_name_name,
- dart_executable);
- if (Dart_IsError(set_executable_name)) {
- return set_executable_name;
- }
- Dart_Handle script_name_name = DartUtils::NewString("_nativeScript");
- if (Dart_IsError(script_name_name)) {
- return script_name_name;
+ return handle;
+}
+
+#define CHECK_RESULT(result) \
+ if (Dart_IsError(result)) { \
+ *error = strdup(Dart_GetError(result)); \
+ LOGE(*error); \
+ Dart_ExitScope(); \
+ Dart_ShutdownIsolate(); \
+ return false; \
}
- Dart_Handle set_script_name =
- Dart_SetField(runtime_options_class, script_name_name, dart_script);
- if (Dart_IsError(set_script_name)) {
- return set_script_name;
+
+Dart_Handle VMGlue::LibraryTagHandler(Dart_LibraryTag tag,
+ Dart_Handle library,
+ Dart_Handle urlHandle) {
+ const char* url;
+ Dart_StringToCString(urlHandle, &url);
+ if (tag == kCanonicalizeUrl) {
+ return urlHandle;
}
- Dart_Handle native_name = DartUtils::NewString("_nativeArguments");
- if (Dart_IsError(native_name)) {
- return native_name;
+ // TODO(vsm): Split this up into separate libraries for 3D, 2D,
+ // Touch, Audio, etc. All builtin libraries should be handled here
+ // (or moved into a snapshot).
+ if (strcmp(url, "android_extension.dart") == 0) {
+ Dart_Handle source = VMGlue::LoadSourceFromFile("/data/data/com.google.dartndk/app_dart/android_extension.dart");
+ Dart_Handle library = CheckError(Dart_LoadLibrary(urlHandle, source));
+ CheckError(Dart_SetNativeResolver(library, ResolveName));
+ return library;
}
- return Dart_SetField(runtime_options_class, native_name, dart_arguments);
+ LOGE("UNIMPLEMENTED: load library %s\n", url);
+ return NULL;
}
-#define CHECK_RESULT(result) \
- if (Dart_IsError(result)) { \
- *error = strdup(Dart_GetError(result)); \
- Log::PrintErr(*error); \
- Dart_ExitScope(); \
- Dart_ShutdownIsolate(); \
- return false; \
- }
-
// Returns true on success, false on failure.
bool VMGlue::CreateIsolateAndSetupHelper(const char* script_uri,
- const char* main,
- void* data,
- char** error) {
- Log::Print("Creating isolate %s, %s", script_uri, main);
+ const char* main,
+ void* data,
+ char** error) {
+ LOGI("Creating isolate %s, %s", script_uri, main);
Dart_Isolate isolate =
- Dart_CreateIsolate(script_uri, main, snapshot_buffer, data, error);
+ Dart_CreateIsolate(script_uri, main, NULL, data, error);
if (isolate == NULL) {
- Log::PrintErr("Couldn't create isolate: %s", error);
+ LOGE("Couldn't create isolate: %s", error);
return false;
}
- Log::Print("Entering scope");
+ LOGI("Entering scope");
Dart_EnterScope();
- if (snapshot_buffer != NULL) {
- // Setup the native resolver as the snapshot does not carry it.
- Builtin::SetNativeResolver(Builtin::kBuiltinLibrary);
- Builtin::SetNativeResolver(Builtin::kIOLibrary);
- }
-
// Set up the library tag handler for this isolate.
- Log::Print("Setting up library tag handler");
- Dart_Handle result = Dart_SetLibraryTagHandler(DartUtils::LibraryTagHandler);
- CHECK_RESULT(result);
-
- // Load the specified application script into the newly created isolate.
- Dart_Handle library;
-
- // Prepare builtin and its dependent libraries for use to resolve URIs.
- Log::Print("Preparing uriLibrary");
- Dart_Handle uri_lib = Builtin::LoadAndCheckLibrary(Builtin::kUriLibrary);
- CHECK_RESULT(uri_lib);
- Log::Print("Preparing builtinLibrary");
- Dart_Handle builtin_lib =
- Builtin::LoadAndCheckLibrary(Builtin::kBuiltinLibrary);
- CHECK_RESULT(builtin_lib);
-
- // Prepare for script loading by setting up the 'print' and 'timer'
- // closures and setting up 'package root' for URI resolution.
- char* package_root = NULL;
- Log::Print("Preparing for script loading");
- result = DartUtils::PrepareForScriptLoading(package_root, builtin_lib);
+ LOGI("Setting up library tag handler");
+ Dart_Handle result = CheckError(Dart_SetLibraryTagHandler(LibraryTagHandler));
CHECK_RESULT(result);
- Log::Print("Loading script %s", script_uri);
- library = DartUtils::LoadScript(script_uri, builtin_lib);
-
- CHECK_RESULT(library);
- if (!Dart_IsLibrary(library)) {
- Log::PrintErr("Expected a library when loading script: %s",
- script_uri);
- Dart_ExitScope();
- Dart_ShutdownIsolate();
- return false;
- }
Dart_ExitScope();
return true;
}
bool VMGlue::CreateIsolateAndSetup(const char* script_uri,
- const char* main,
- void* data, char** error) {
+ const char* main,
+ void* data, char** error) {
return CreateIsolateAndSetupHelper(script_uri,
main,
- new IsolateData(),
+ data,
error);
}
#define VMHOSTNAME "android_dart_host"
#define MAINSCRIPT "/data/data/com.google.dartndk/app_dart/main.dart"
-void VMGlue::ShutdownIsolate(void* callback_data) {
- IsolateData* isolate_data = reinterpret_cast<IsolateData*>(callback_data);
- EventHandler* handler = isolate_data->event_handler;
- if (handler != NULL) handler->Shutdown();
- delete isolate_data;
-}
+const char* VM_FLAGS[] = {
+ "--enable_type_checks",
+ "--trace_isolates",
+ "--trace_natives",
+};
int VMGlue::InitializeVM() {
- // Perform platform specific initialization.
- Log::Print("Initializing platform");
- if (!Platform::Initialize()) {
- Log::PrintErr("Initialization failed\n");
- return -1;
- }
-
- // We need the next call to get Datrt_Initialize not to bail early.
- Log::Print("Processing command line flags");
- dart::Flags::ProcessCommandLineFlags(0, NULL);
+ // We need the next call to get Dart_Initialize not to bail early.
+ LOGI("Setting VM Options");
+ Dart_SetVMFlags(sizeof(VM_FLAGS) / sizeof(VM_FLAGS[0]), VM_FLAGS);
// Initialize the Dart VM, providing the callbacks to use for
// creating and shutting down isolates.
- Log::Print("Initializing Dart");
+ LOGI("Initializing Dart");
if (!Dart_Initialize(CreateIsolateAndSetup,
- NULL,
- NULL,
- ShutdownIsolate)) {
- Log::PrintErr("VM initialization failed\n");
+ NULL,
+ NULL,
+ NULL)) {
+ LOGE("VM initialization failed\n");
return -1;
}
- DartUtils::SetOriginalWorkingDirectory();
initialized_vm_ = true;
+
return 0;
}
+Dart_Handle VMGlue::LoadSourceFromFile(const char* url) {
+ FILE* file = fopen(url, "r");
+ if (file == NULL) {
+ LOGE("Main script not found at: %s\n", url);
+ return NULL;
+ }
+
+ struct stat sb;
+ int fd = fileno(file);
+ fstat(fd, &sb);
+ int length = sb.st_size;
+ LOGI("Entry file %s is %d bytes.\n", url, length);
+
+ char* buffer = reinterpret_cast<char *>(malloc((length + 1) * sizeof(char)));
+ if (read(fd, buffer, length) < 0) {
+ LOGE("Could not read script %s.\n", url);
+ return NULL;
+ }
+ buffer[length] = 0;
+ fclose(file);
+
+ Dart_Handle contents = CheckError(Dart_NewStringFromCString(buffer));
+ free(buffer);
+ return contents;
+}
+
int VMGlue::StartMainIsolate() {
if (!initialized_vm_) {
int rtn = InitializeVM();
@@ -219,14 +170,19 @@ int VMGlue::StartMainIsolate() {
// Create an isolate and loads up the application script.
char* error = NULL;
if (!CreateIsolateAndSetup(MAINSCRIPT, "main", NULL, &error)) {
- Log::PrintErr("CreateIsolateAndSetup: %s\n", error);
+ LOGE("CreateIsolateAndSetup: %s\n", error);
free(error);
return -1;
}
+ LOGI("Created isolate");
+ isolate_ = Dart_CurrentIsolate();
+ Dart_EnterScope();
- Log::Print("Created isolate");
+ Dart_Handle url = CheckError(Dart_NewStringFromCString(MAINSCRIPT));
+ Dart_Handle source = LoadSourceFromFile(MAINSCRIPT);
+ CheckError(Dart_LoadScript(url, source));
- isolate_ = Dart_CurrentIsolate();
+ Dart_ExitScope();
Dart_ExitIsolate();
return 0;
}
@@ -234,16 +190,16 @@ int VMGlue::StartMainIsolate() {
int VMGlue::CallSetup() {
if (!initialized_script_) {
initialized_script_ = true;
- Log::Print("Invoking setup");
+ LOGI("Invoking setup");
Dart_EnterIsolate(isolate_);
Dart_EnterScope();
Dart_Handle args[2];
- args[0] = Dart_NewInteger(graphics_->width());
- args[1] = Dart_NewInteger(graphics_->height());
+ args[0] = CheckError(Dart_NewInteger(graphics_->width()));
+ args[1] = CheckError(Dart_NewInteger(graphics_->height()));
int rtn = Invoke("setup", 2, args);
Dart_ExitScope();
Dart_ExitIsolate();
- Log::Print("Done setup");
+ LOGI("Done setup");
return rtn;
}
return 0;
@@ -251,53 +207,53 @@ int VMGlue::CallSetup() {
int VMGlue::CallUpdate() {
if (initialized_script_) {
- Log::Print("Invoking update");
+ LOGI("Invoking update");
Dart_EnterIsolate(isolate_);
Dart_EnterScope();
int rtn = Invoke("update", 0, 0);
Dart_ExitScope();
Dart_ExitIsolate();
- Log::Print("Done update");
+ LOGI("Done update");
return rtn;
}
return -1;
}
int VMGlue::OnMotionEvent(const char* pFunction, int64_t pWhen,
- float pMoveX, float pMoveY) {
+ float pMoveX, float pMoveY) {
if (initialized_script_) {
- Log::Print("Invoking %s", pFunction);
+ LOGI("Invoking %s", pFunction);
Dart_EnterIsolate(isolate_);
Dart_EnterScope();
Dart_Handle args[3];
- args[0] = Dart_NewInteger(pWhen);
- args[1] = Dart_NewDouble(pMoveX);
- args[2] = Dart_NewDouble(pMoveY);
+ args[0] = CheckError(Dart_NewInteger(pWhen));
+ args[1] = CheckError(Dart_NewDouble(pMoveX));
+ args[2] = CheckError(Dart_NewDouble(pMoveY));
int rtn = Invoke(pFunction, 3, args);
Dart_ExitScope();
Dart_ExitIsolate();
- Log::Print("Done %s", pFunction);
+ LOGI("Done %s", pFunction);
return rtn;
}
return -1;
}
int VMGlue::OnKeyEvent(const char* function, int64_t when, int32_t flags,
- int32_t key_code, int32_t meta_state, int32_t repeat) {
+ int32_t key_code, int32_t meta_state, int32_t repeat) {
if (initialized_script_) {
- Log::Print("Invoking %s", function);
+ LOGI("Invoking %s", function);
Dart_EnterIsolate(isolate_);
Dart_EnterScope();
Dart_Handle args[5];
- args[0] = Dart_NewInteger(when);
- args[1] = Dart_NewInteger(flags);
- args[2] = Dart_NewInteger(key_code);
- args[3] = Dart_NewInteger(meta_state);
- args[4] = Dart_NewInteger(repeat);
+ args[0] = CheckError(Dart_NewInteger(when));
+ args[1] = CheckError(Dart_NewInteger(flags));
+ args[2] = CheckError(Dart_NewInteger(key_code));
+ args[3] = CheckError(Dart_NewInteger(meta_state));
+ args[4] = CheckError(Dart_NewInteger(repeat));
int rtn = Invoke(function, 5, args);
Dart_ExitScope();
Dart_ExitIsolate();
- Log::Print("Done %s", function);
+ LOGI("Done %s", function);
return rtn;
}
return -1;
@@ -306,50 +262,40 @@ int VMGlue::OnKeyEvent(const char* function, int64_t when, int32_t flags,
int VMGlue::Invoke(const char* function, int argc, Dart_Handle* args) {
Dart_Handle result;
- Log::Print("in invoke(%s)", function);
-
- // Create a dart options object that can be accessed from dart code.
- Log::Print("setting up runtime options");
- CommandLineOptions dart_options(0);
- Dart_Handle options_result =
- SetupRuntimeOptions(&dart_options, VMHOSTNAME, MAINSCRIPT);
- if (Dart_IsError(options_result)) {
- return ErrorExit("%s\n", Dart_GetError(options_result));
- }
+ LOGI("in invoke(%s)", function);
// Lookup the library of the root script.
- Log::Print("looking up the root library");
+ LOGI("looking up the root library");
Dart_Handle library = Dart_RootLibrary();
if (Dart_IsNull(library)) {
return ErrorExit("Unable to find root library\n");
}
// Lookup and invoke the appropriate function.
- result = Dart_Invoke(library, DartUtils::NewString(function), argc, args);
+ LOGI("invoking %s", function);
+ result = Dart_Invoke(library, Dart_NewStringFromCString(function), argc, args);
if (Dart_IsError(result)) {
return ErrorExit("%s\n", Dart_GetError(result));
}
+ // TODO(vsm): I don't think we need this.
// Keep handling messages until the last active receive port is closed.
- Log::Print("Entering Dart message loop");
+ LOGI("Entering Dart message loop");
result = Dart_RunLoop();
if (Dart_IsError(result)) {
return ErrorExit("%s\n", Dart_GetError(result));
}
- Log::Print("out invoke");
+ LOGI("out invoke");
return 0;
}
void VMGlue::FinishMainIsolate() {
- Log::Print("Finish main isolate");
+ LOGI("Finish main isolate");
Dart_EnterIsolate(isolate_);
// Shutdown the isolate.
Dart_ShutdownIsolate();
- // Terminate process exit-code handler.
- Process::TerminateExitCodeHandler();
isolate_ = NULL;
initialized_script_ = false;
}
-
« no previous file with comments | « samples/android_sample/jni/vm_glue.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698