From c5bda29ce3d830559b39284323e24f95e098343b Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 13 Dec 2012 15:32:35 +0100 Subject: [PATCH] (Android) Refactor JNI code --- android/native/jni/jni_utils.c | 43 +++++++++++++++++++++++++ android/native/jni/jni_utils.h | 43 +++++++++++++++++++++++++ android/native/jni/main.c | 59 +++++++++++++++++----------------- console/griffin/griffin.c | 10 ++++-- 4 files changed, 123 insertions(+), 32 deletions(-) create mode 100644 android/native/jni/jni_utils.c create mode 100644 android/native/jni/jni_utils.h diff --git a/android/native/jni/jni_utils.c b/android/native/jni/jni_utils.c new file mode 100644 index 0000000000..f98c096fd6 --- /dev/null +++ b/android/native/jni/jni_utils.c @@ -0,0 +1,43 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2012 - Hans-Kristian Arntzen + * Copyright (C) 2011-2012 - Daniel De Matteis + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#include +#include +#include "jni_utils.h" + +void jni_get_char_argv(struct jni_params *params, struct jni_out_params_char *out_params) +{ + JNIEnv *env; + JavaVM *vm = params->java_vm; + + (*vm)->AttachCurrentThread(vm, &env, 0); + + jclass acl = (*env)->GetObjectClass(env, params->class_obj); //class pointer + jmethodID giid = (*env)->GetMethodID(env, acl, params->method_name, params->method_signature); + jobject obj = (*env)->CallObjectMethod(env, params->class_obj, giid); //Got our object + + jclass class_obj = (*env)->GetObjectClass(env, obj); //class pointer of object + jmethodID gseid = (*env)->GetMethodID(env, class_obj, params->obj_method_name, params->obj_method_signature); + + jstring jsParam1 = (*env)->CallObjectMethod(env, obj, gseid, (*env)->NewStringUTF(env, out_params->in)); + const char *test_argv = (*env)->GetStringUTFChars(env, jsParam1, 0); + + strncpy(out_params->out, test_argv, out_params->out_sizeof); + + (*env)->ReleaseStringUTFChars(env, jsParam1, test_argv); + + (*vm)->DetachCurrentThread(vm); +} diff --git a/android/native/jni/jni_utils.h b/android/native/jni/jni_utils.h new file mode 100644 index 0000000000..0e1b11b6d4 --- /dev/null +++ b/android/native/jni/jni_utils.h @@ -0,0 +1,43 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2012 - Hans-Kristian Arntzen + * Copyright (C) 2011-2012 - Daniel De Matteis + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#ifndef _RARCH_JNI_UTILS_H +#define _RARCH_JNI_UTILS_H + +#include +#include "android_glue.h" + +struct jni_params +{ + JavaVM *java_vm; + jobject class_obj; + char class_name[128]; + char method_name[128]; + char method_signature[128]; + char obj_method_name[128]; + char obj_method_signature[128]; +}; + +struct jni_out_params_char +{ + char *out; + size_t out_sizeof; + char in[128]; +}; + +void jni_get_char_argv(struct jni_params *params, struct jni_out_params_char *out_params); + +#endif diff --git a/android/native/jni/main.c b/android/native/jni/main.c index 6328329b83..b3b6489005 100644 --- a/android/native/jni/main.c +++ b/android/native/jni/main.c @@ -15,12 +15,12 @@ */ #include -#include #include #include #include #include +#include "jni_utils.h" #include "android_general.h" #include "../../../general.h" #include "../../../performance.h" @@ -73,32 +73,6 @@ int android_get_sdk_version(void) return AConfiguration_getSdkVersion(g_android.app->config); } -static void android_get_char_argv(char *argv, size_t sizeof_argv, const char *arg_name) -{ - JNIEnv *env; - JavaVM *rarch_vm = g_android.app->activity->vm; - - (*rarch_vm)->AttachCurrentThread(rarch_vm, &env, 0); - - jobject me = g_android.app->activity->clazz; - - jclass acl = (*env)->GetObjectClass(env, me); //class pointer of NativeActivity - jmethodID giid = (*env)->GetMethodID(env, acl, "getIntent", "()Landroid/content/Intent;"); - jobject intent = (*env)->CallObjectMethod(env, me, giid); //Got our intent - - jclass icl = (*env)->GetObjectClass(env, intent); //class pointer of Intent - jmethodID gseid = (*env)->GetMethodID(env, icl, "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;"); - - jstring jsParam1 = (*env)->CallObjectMethod(env, intent, gseid, (*env)->NewStringUTF(env, arg_name)); - const char *test_argv = (*env)->GetStringUTFChars(env, jsParam1, 0); - - strncpy(argv, test_argv, sizeof_argv); - - (*env)->ReleaseStringUTFChars(env, jsParam1, test_argv); - - (*rarch_vm)->DetachCurrentThread(rarch_vm); -} - /** * Process the next main command. */ @@ -334,12 +308,37 @@ static void* android_app_entry(void* param) char libretro_path[512]; // Get arguments */ - android_get_char_argv(rom_path, sizeof(rom_path), "ROM"); - android_get_char_argv(libretro_path, sizeof(libretro_path), "LIBRETRO"); + struct jni_params jni_args; + + jni_args.java_vm = g_android.app->activity->vm; + jni_args.class_obj = g_android.app->activity->clazz; + snprintf(jni_args.method_name, sizeof(jni_args.method_name), "getIntent"); + snprintf(jni_args.method_signature, sizeof(jni_args.method_signature), "()Landroid/content/Intent;"); + snprintf(jni_args.obj_method_name, sizeof(jni_args.obj_method_name), "getStringExtra"); + snprintf(jni_args.obj_method_signature, sizeof(jni_args.obj_method_signature), "(Ljava/lang/String;)Ljava/lang/String;"); + + struct jni_out_params_char out_args; + + out_args.out = rom_path; + out_args.out_sizeof = sizeof(rom_path); + snprintf(out_args.in, sizeof(out_args.in), "ROM"); + + jni_get_char_argv(&jni_args, &out_args); + + out_args.out = libretro_path; + out_args.out_sizeof = sizeof(libretro_path); + snprintf(out_args.in, sizeof(out_args.in), "LIBRETRO"); + + jni_get_char_argv(&jni_args, &out_args); + char refreshrate_char[128]; float refreshrate; + + out_args.out = refreshrate_char; + out_args.out_sizeof = sizeof(refreshrate_char); + snprintf(out_args.in, sizeof(out_args.in), "REFRESHRATE"); - android_get_char_argv(refreshrate_char,sizeof(refreshrate_char), "REFRESHRATE"); + jni_get_char_argv(&jni_args, &out_args); refreshrate = (float)strtod(refreshrate_char, NULL); diff --git a/console/griffin/griffin.c b/console/griffin/griffin.c index d0bd986416..5523043ba6 100644 --- a/console/griffin/griffin.c +++ b/console/griffin/griffin.c @@ -28,11 +28,18 @@ LOGGERS #include "../logger/logger.c" #endif -#ifdef RARCH_CONSOLE +/*============================================================ +JNI UTILS +============================================================ */ + +#ifdef ANDROID +#include "../../android/native/jni/jni_utils.c" +#endif /*============================================================ CONSOLE EXTENSIONS ============================================================ */ +#ifdef RARCH_CONSOLE #include "../rarch_console.h" @@ -76,7 +83,6 @@ default_paths_t default_paths; #include "../rarch_console_libretro_mgmt.c" #endif - #endif /*============================================================