summaryrefslogtreecommitdiff
path: root/demos
diff options
context:
space:
mode:
authorCody Northrop <cnorthrop@google.com>2016-12-02 11:25:54 -0700
committerCody Northrop <cnorthrop@google.com>2016-12-06 11:27:12 -0700
commitcf4815bef7ddfea4119902a03fa2c476bf413a2e (patch)
treecf93f69f27a1adc8a0a787efb651eb8f26b3a75c /demos
parent3f3748ad269026bc9e1b27604cb1be39585c97b2 (diff)
smoke: Port arg parsing from Hologram
Diffstat (limited to 'demos')
-rw-r--r--demos/smoke/Main.cpp7
-rw-r--r--demos/smoke/ShellAndroid.cpp48
-rw-r--r--demos/smoke/ShellAndroid.h2
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();