diff options
author | Cody Northrop <cnorthrop@google.com> | 2016-12-02 11:25:54 -0700 |
---|---|---|
committer | Cody Northrop <cnorthrop@google.com> | 2016-12-06 11:27:12 -0700 |
commit | cf4815bef7ddfea4119902a03fa2c476bf413a2e (patch) | |
tree | cf93f69f27a1adc8a0a787efb651eb8f26b3a75c /demos | |
parent | 3f3748ad269026bc9e1b27604cb1be39585c97b2 (diff) |
smoke: Port arg parsing from Hologram
Diffstat (limited to 'demos')
-rw-r--r-- | demos/smoke/Main.cpp | 7 | ||||
-rw-r--r-- | demos/smoke/ShellAndroid.cpp | 48 | ||||
-rw-r--r-- | demos/smoke/ShellAndroid.h | 2 |
3 files changed, 56 insertions, 1 deletions
diff --git a/demos/smoke/Main.cpp b/demos/smoke/Main.cpp index a59ff1b4..5150d4a4 100644 --- a/demos/smoke/Main.cpp +++ b/demos/smoke/Main.cpp @@ -21,6 +21,11 @@ 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); diff --git a/demos/smoke/ShellAndroid.cpp b/demos/smoke/ShellAndroid.cpp index 4fab5bdc..2e371e45 100644 --- a/demos/smoke/ShellAndroid.cpp +++ b/demos/smoke/ShellAndroid.cpp @@ -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"); diff --git a/demos/smoke/ShellAndroid.h b/demos/smoke/ShellAndroid.h index 00d63efb..c537dc73 100644 --- a/demos/smoke/ShellAndroid.h +++ b/demos/smoke/ShellAndroid.h @@ -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(); |