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);
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);
} // 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");