You've already forked android_translation_layer
mirror of
https://gitlab.com/android_translation_layer/android_translation_layer.git
synced 2025-10-27 11:48:10 -07:00
main-executable: add '-e' cmdline option
Some multi-platform apps accept cmdline options using the `-e` option of `am`. For example, you can now use `-e unity='<unity cmdline>'` to pass cmdline arguments to a unity game.
This commit is contained in:
@@ -157,6 +157,9 @@ void set_up_handle_cache(JNIEnv *env)
|
|||||||
handle_cache.drawable.class = _REF((*env)->FindClass(env, "android/graphics/drawable/Drawable"));
|
handle_cache.drawable.class = _REF((*env)->FindClass(env, "android/graphics/drawable/Drawable"));
|
||||||
handle_cache.drawable.draw = _METHOD(handle_cache.drawable.class, "draw", "(Landroid/graphics/Canvas;)V");
|
handle_cache.drawable.draw = _METHOD(handle_cache.drawable.class, "draw", "(Landroid/graphics/Canvas;)V");
|
||||||
handle_cache.drawable.setBounds = _METHOD(handle_cache.drawable.class, "setBounds", "(IIII)V");
|
handle_cache.drawable.setBounds = _METHOD(handle_cache.drawable.class, "setBounds", "(IIII)V");
|
||||||
|
|
||||||
|
handle_cache.intent.class = _REF((*env)->FindClass(env, "android/content/Intent"));
|
||||||
|
handle_cache.intent.putExtraCharSequence = _METHOD(handle_cache.intent.class, "putExtra", "(Ljava/lang/String;Ljava/lang/CharSequence;)Landroid/content/Intent;");
|
||||||
}
|
}
|
||||||
|
|
||||||
void extract_from_apk(const char *path, const char *target) {
|
void extract_from_apk(const char *path, const char *target) {
|
||||||
|
|||||||
@@ -106,6 +106,10 @@ struct handle_cache {
|
|||||||
jmethodID draw;
|
jmethodID draw;
|
||||||
jmethodID setBounds;
|
jmethodID setBounds;
|
||||||
} drawable;
|
} drawable;
|
||||||
|
struct {
|
||||||
|
jclass class;
|
||||||
|
jmethodID putExtraCharSequence;
|
||||||
|
} intent;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct handle_cache handle_cache;
|
extern struct handle_cache handle_cache;
|
||||||
|
|||||||
@@ -191,6 +191,7 @@ struct jni_callback_data {
|
|||||||
gboolean install;
|
gboolean install;
|
||||||
char *prgname;
|
char *prgname;
|
||||||
char **extra_jvm_options;
|
char **extra_jvm_options;
|
||||||
|
char **extra_string_keys;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void open(GtkApplication *app, GFile** files, gint nfiles, const gchar* hint, struct jni_callback_data *d)
|
static void open(GtkApplication *app, GFile** files, gint nfiles, const gchar* hint, struct jni_callback_data *d)
|
||||||
@@ -425,8 +426,30 @@ static void open(GtkApplication *app, GFile** files, gint nfiles, const gchar* h
|
|||||||
if((*env)->ExceptionCheck(env))
|
if((*env)->ExceptionCheck(env))
|
||||||
(*env)->ExceptionDescribe(env);
|
(*env)->ExceptionDescribe(env);
|
||||||
|
|
||||||
|
if(d->extra_string_keys) {
|
||||||
|
GError *error = NULL;
|
||||||
|
GRegex *regex = g_regex_new("(?<!\\\\)=", 0, 0, &error);
|
||||||
|
if (!regex) {
|
||||||
|
fprintf(stderr, "g_regex_new error: '%s'\n", error->message);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
/* -- set the window title and (FIXME) app icon -- */
|
jobject intent = _GET_OBJ_FIELD(activity_object, "intent", "Landroid/content/Intent;");
|
||||||
|
|
||||||
|
for(char **arg = d->extra_string_keys; *arg; arg++) {
|
||||||
|
gchar **keyval = g_regex_split_full(regex, *arg, -1, 0, 0, 2, NULL);
|
||||||
|
if(!keyval || !keyval[0] || !keyval[1]) {
|
||||||
|
fprintf(stderr, "extra string arg not in 'key=value' format: '%s'\n", *arg);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
(*env)->CallObjectMethod(env, intent, handle_cache.intent.putExtraCharSequence, _JSTRING(keyval[0]), _JSTRING(keyval[1]));
|
||||||
|
g_strfreev(keyval);
|
||||||
|
}
|
||||||
|
g_regex_unref(regex);
|
||||||
|
g_strfreev(d->extra_string_keys);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -- set the window title and app icon -- */
|
||||||
|
|
||||||
package_name = _CSTRING((*env)->CallObjectMethod(env, activity_object, handle_cache.context.get_package_name));
|
package_name = _CSTRING((*env)->CallObjectMethod(env, activity_object, handle_cache.context.get_package_name));
|
||||||
if((*env)->ExceptionCheck(env))
|
if((*env)->ExceptionCheck(env))
|
||||||
@@ -590,6 +613,14 @@ void init_cmd_parameters(GApplication *app, struct jni_callback_data *d)
|
|||||||
.arg_data = &d->extra_jvm_options,
|
.arg_data = &d->extra_jvm_options,
|
||||||
.description = "install .desktop file for the given apk",
|
.description = "install .desktop file for the given apk",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.long_name = "extra-string-key",
|
||||||
|
.short_name = 'e',
|
||||||
|
.flags = 0,
|
||||||
|
.arg = G_OPTION_ARG_STRING_ARRAY,
|
||||||
|
.arg_data = &d->extra_string_keys,
|
||||||
|
.description = "pass a string extra (-e key=value)",
|
||||||
|
},
|
||||||
{NULL}
|
{NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -618,6 +649,7 @@ int main(int argc, char **argv)
|
|||||||
callback_data->install = FALSE;
|
callback_data->install = FALSE;
|
||||||
callback_data->prgname = argv[0];
|
callback_data->prgname = argv[0];
|
||||||
callback_data->extra_jvm_options = NULL;
|
callback_data->extra_jvm_options = NULL;
|
||||||
|
callback_data->extra_string_keys = NULL;
|
||||||
|
|
||||||
app = gtk_application_new("com.example.demo_application", G_APPLICATION_NON_UNIQUE | G_APPLICATION_HANDLES_OPEN | G_APPLICATION_CAN_OVERRIDE_APP_ID);
|
app = gtk_application_new("com.example.demo_application", G_APPLICATION_NON_UNIQUE | G_APPLICATION_HANDLES_OPEN | G_APPLICATION_CAN_OVERRIDE_APP_ID);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user