smoke: Port arg parsing from Hologram
authorCody Northrop <cnorthrop@google.com>
Fri, 2 Dec 2016 18:25:54 +0000 (11:25 -0700)
committerCody Northrop <cnorthrop@google.com>
Tue, 6 Dec 2016 18:27:12 +0000 (11:27 -0700)
demos/smoke/Main.cpp
demos/smoke/ShellAndroid.cpp
demos/smoke/ShellAndroid.h

index a59ff1b..5150d4a 100644 (file)
 
 namespace {
 
+Game *create_game(const std::vector<std::string> &args)
+{
+    return new Smoke(args);
+}
+
 Game *create_game(int argc, char **argv)
 {
     std::vector<std::string> args(argv, argv + argc);
@@ -67,7 +72,7 @@ int main(int argc, char **argv) {
 
 void android_main(android_app *app)
 {
-    Game *game = create_game(0, nullptr);
+    Game *game = create_game(ShellAndroid::get_args(*app));
 
     try {
         ShellAndroid shell(*app, *game);
index 4fab5bd..2e371e4 100644 (file)
@@ -65,6 +65,54 @@ private:
 
 } // namespace
 
+std::vector<std::string> ShellAndroid::get_args(android_app &app)
+{
+    const char intent_extra_data_key[] = "args";
+    std::vector<std::string> args;
+
+    JavaVM &vm = *app.activity->vm;
+    JNIEnv *p_env;
+    if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK)
+        return args;
+
+    JNIEnv &env = *p_env;
+    jobject activity = app.activity->clazz;
+    jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity),
+            "getIntent", "()Landroid/content/Intent;");
+    jobject intent = env.CallObjectMethod(activity, get_intent_method);
+
+    jmethodID get_string_extra_method = env.GetMethodID(env.GetObjectClass(intent),
+            "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
+    jvalue get_string_extra_args;
+    get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
+    jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent,
+            get_string_extra_method, &get_string_extra_args));
+
+    std::string args_str;
+    if (extra_str) {
+        const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
+        args_str = extra_utf;
+        env.ReleaseStringUTFChars(extra_str, extra_utf);
+
+        env.DeleteLocalRef(extra_str);
+    }
+
+    env.DeleteLocalRef(get_string_extra_args.l);
+    env.DeleteLocalRef(intent);
+
+    vm.DetachCurrentThread();
+
+    // split args_str
+    std::stringstream ss(args_str);
+    std::string arg;
+    while (std::getline(ss, arg, ' ')) {
+        if (!arg.empty())
+            args.push_back(arg);
+    }
+
+    return args;
+}
+
 ShellAndroid::ShellAndroid(android_app &app, Game &game) : Shell(game), app_(app)
 {
     instance_layers_.push_back("VK_LAYER_GOOGLE_threading");
index 00d63ef..c537dc7 100644 (file)
@@ -22,6 +22,8 @@
 
 class ShellAndroid : public Shell {
 public:
+    static std::vector<std::string> get_args(android_app &app);
+
     ShellAndroid(android_app &app, Game &game);
     ~ShellAndroid();