From 80b2974b7e41425981a09e7561019d1be7d4ccc3 Mon Sep 17 00:00:00 2001 From: Michael Rennie Date: Thu, 25 Aug 2016 14:42:14 +0100 Subject: [PATCH] Pass in apk parameters via am start ... -e renderdoccmd "args" Examples: adb shell am start -n org.renderdoc.renderdoccmd/.Loader -e renderdoccmd "remoteserver" adb shell am start -n org.renderdoc.renderdoccmd/.Loader -e renderdoccmd "replay /sdcard/capture.rdc" --- renderdoccmd/renderdoccmd_android.cpp | 59 ++++++++++++++++++++------- 1 file changed, 45 insertions(+), 14 deletions(-) diff --git a/renderdoccmd/renderdoccmd_android.cpp b/renderdoccmd/renderdoccmd_android.cpp index 1a75e97df..fdbf9a32c 100644 --- a/renderdoccmd/renderdoccmd_android.cpp +++ b/renderdoccmd/renderdoccmd_android.cpp @@ -39,6 +39,8 @@ extern "C" { #define LOGCAT_TAG "renderdoc" using std::string; +using std::vector; +using std::istringstream; struct android_app *android_state; @@ -70,28 +72,57 @@ void DisplayRendererPreview(ReplayRenderer *renderer, TextureDisplay &displayCfg } } +// Returns the renderdoccmd arguments passed via am start +// Examples: am start ... -e renderdoccmd "remoteserver" +// -e renderdoccmd "replay /sdcard/capture.rdc" +vector getRenderdoccmdArgs() +{ + JNIEnv *env; + android_state->activity->vm->AttachCurrentThread(&env, 0); + + jobject me = android_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("renderdoccmd")); + + vector ret; + if(!jsParam1) + return ret; // No arg value found + + ret.push_back("renderdoccmd"); + + const char *param1 = env->GetStringUTFChars(jsParam1, 0); + istringstream iss(param1); + while(iss) + { + string sub; + iss >> sub; + ret.push_back(sub); + } + return ret; +} + void handle_cmd(android_app *app, int32_t cmd) { switch(cmd) { case APP_CMD_INIT_WINDOW: { - // The window is being shown, get it ready. - - __android_log_print(ANDROID_LOG_INFO, LOGCAT_TAG, - "APP_CMD_INIT_WINDOW: android_state->window: %p", android_state->window); - - const char *argv[] = { - "renderdoccmd", "replay", "/sdcard/capture.rdc", - }; - int argc = sizeof(argv) / sizeof(argv[0]); - renderdoccmd(argc, (char **)argv); + vector args = getRenderdoccmdArgs(); + if(!args.size()) + break; // Nothing for APK to do. + renderdoccmd(args); break; } - case APP_CMD_TERM_WINDOW: - // The window is being hidden or closed, clean it up. - // DeleteVulkan(); - break; + case APP_CMD_TERM_WINDOW: break; default: __android_log_print(ANDROID_LOG_INFO, LOGCAT_TAG, "event not handled: %d", cmd); } }