| Index: platform_tools/android/visualbench/jni/main.cpp
 | 
| diff --git a/platform_tools/android/visualbench/jni/main.cpp b/platform_tools/android/visualbench/jni/main.cpp
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..293041ae8e9ed869495b8df6e72298d5877592fc
 | 
| --- /dev/null
 | 
| +++ b/platform_tools/android/visualbench/jni/main.cpp
 | 
| @@ -0,0 +1,128 @@
 | 
| +/*
 | 
| + * 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.
 | 
| + */
 | 
| +struct VisualBenchState {
 | 
| +    VisualBenchState() : fApp(NULL), fWindow(NULL) {}
 | 
| +    struct android_app* fApp;
 | 
| +    SkOSWindow* fWindow;
 | 
| +    SkTArray<SkString> fFlags;
 | 
| +};
 | 
| +
 | 
| +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) {
 | 
| +                if (state->fWindow) {
 | 
| +                    SkDELETE(state->fWindow);
 | 
| +                    application_term();
 | 
| +                }
 | 
| +
 | 
| +                // 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()));
 | 
| +            }
 | 
| +            break;
 | 
| +        case APP_CMD_TERM_WINDOW:
 | 
| +            SkDELETE(state->fWindow);
 | 
| +            state->fWindow = NULL;
 | 
| +            application_term();
 | 
| +            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("cmdLineArguments"));
 | 
| +    if (jsParam1) {
 | 
| +        const char* flags = env->GetStringUTFChars(jsParam1, 0);
 | 
| +        SkTArray<SkString> flagEntries;
 | 
| +        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) {
 | 
| +                SkDELETE(visualBenchState.fWindow);
 | 
| +                application_term();
 | 
| +                return;
 | 
| +            }
 | 
| +        }
 | 
| +
 | 
| +        if (visualBenchState.fWindow) {
 | 
| +            if (visualBenchState.fWindow->destroyRequested()) {
 | 
| +                SkDELETE(visualBenchState.fWindow);
 | 
| +                visualBenchState.fWindow = NULL;
 | 
| +                application_term();
 | 
| +                break;
 | 
| +            }
 | 
| +            visualBenchState.fWindow->update(NULL);
 | 
| +        }
 | 
| +    }
 | 
| +    ANativeActivity_finish(state->activity);
 | 
| +}
 | 
| 
 |