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); |
+} |