diff options
Diffstat (limited to 'platform_tools/android/visualbench/jni/main.cpp')
-rw-r--r-- | platform_tools/android/visualbench/jni/main.cpp | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/platform_tools/android/visualbench/jni/main.cpp b/platform_tools/android/visualbench/jni/main.cpp new file mode 100644 index 0000000000..2ea6b76b39 --- /dev/null +++ b/platform_tools/android/visualbench/jni/main.cpp @@ -0,0 +1,134 @@ +/* + * Copyright 2015 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + */ + +#include <android_native_app_glue.h> + +#include "SkApplication.h" +#include "VisualBench.h" + +/** + * Shared state for our app. + */ +enum State { + kInit_State, + kAnimate_State, + kDestroyRequested_State, + kFinished_State, +}; + +struct VisualBenchState { + VisualBenchState() : fApp(NULL), fWindow(NULL), fState(kInit_State) {} + struct android_app* fApp; + SkOSWindow* fWindow; + SkTArray<SkString> fFlags; + State fState; +}; + +static void handle_cmd(struct android_app* app, int32_t cmd) { + struct VisualBenchState* state = (struct VisualBenchState*)app->userData; + switch (cmd) { + case APP_CMD_INIT_WINDOW: + // The window is being shown, get it ready. + if (state->fApp->window != NULL && kInit_State == state->fState) { + // drain any events that occurred before |window| was assigned. + while (SkEvent::ProcessEvent()); + + // Start normal Skia sequence + application_init(); + + SkTArray<const char*> args; + args.push_back("VisualBench"); + for (int i = 0; i < state->fFlags.count(); i++) { + SkDebugf(state->fFlags[i].c_str()); + args.push_back(state->fFlags[i].c_str()); + } + + state->fWindow = create_sk_window((void*)state->fApp->window, + args.count(), + const_cast<char**>(args.begin())); + state->fWindow->forceInvalAll(); + state->fState = kAnimate_State; + } + break; + case APP_CMD_TERM_WINDOW: + state->fState = kDestroyRequested_State; + break; + } +} + +void android_main(struct android_app* state) { + struct VisualBenchState visualBenchState; + + // Make sure glue isn't stripped. + app_dummy(); + + state->userData = &visualBenchState; + state->onAppCmd = handle_cmd; + visualBenchState.fApp = state; + + // Get command line arguments + JavaVM* jvm = state->activity->vm; + JNIEnv *env; + jvm->AttachCurrentThread(&env, 0); + + jobject me = state->activity->clazz; + + jclass acl = env->GetObjectClass(me); //class pointer of NativeActivity + jmethodID giid = env->GetMethodID(acl, "getIntent", "()Landroid/content/Intent;"); + jobject intent = env->CallObjectMethod(me, giid); //Got our intent + + jclass icl = env->GetObjectClass(intent); //class pointer of Intent + jmethodID gseid = env->GetMethodID(icl, "getStringExtra", + "(Ljava/lang/String;)Ljava/lang/String;"); + + jstring jsParam1 = (jstring)env->CallObjectMethod(intent, gseid, + env->NewStringUTF("cmdLineFlags")); + if (jsParam1) { + const char* flags = env->GetStringUTFChars(jsParam1, 0); + SkStrSplit(flags, " ", &visualBenchState.fFlags); + env->ReleaseStringUTFChars(jsParam1, flags); + } + jvm->DetachCurrentThread(); + + while (1) { + // Read all pending events. + int ident; + int events; + struct android_poll_source* source; + + // We loop until all events are read, then continue to draw the next frame of animation. + while ((ident=ALooper_pollAll(0, NULL, &events, (void**)&source)) >= 0) { + // Process this event. + if (source != NULL) { + source->process(state, source); + } + + // Check if we are exiting. + if (state->destroyRequested != 0) { + return; + } + + } + + if (visualBenchState.fWindow) { + if (visualBenchState.fWindow->destroyRequested()) { + visualBenchState.fState = kDestroyRequested_State; + } else { + visualBenchState.fWindow->update(NULL); + } + } + + if (kDestroyRequested_State == visualBenchState.fState) { + SkDELETE(visualBenchState.fWindow); + visualBenchState.fWindow = NULL; + application_term(); + ANativeActivity_finish(state->activity); + visualBenchState.fState = kFinished_State; + } + } +} |