From ff914dd86271e1c038b6e72ede48bd71b0ccdfad Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 16 Oct 2012 12:49:56 +0200 Subject: [PATCH] (Android) Set up RetroArch for real (Android is retarded in that it only allows us to use dlopen on shared libs that are in the app's 'lib' folder - 'security' concerns and all --- android/native/jni/Android.mk | 2 +- android/native/jni/main.c | 82 ++++++++--------------------------- gfx/context/androidegl_ctx.c | 59 ++++++++++++++++++++++++- 3 files changed, 75 insertions(+), 68 deletions(-) diff --git a/android/native/jni/Android.mk b/android/native/jni/Android.mk index 5d2bc51800..201b453230 100644 --- a/android/native/jni/Android.mk +++ b/android/native/jni/Android.mk @@ -44,7 +44,7 @@ LOCAL_SRC_FILES = $(RARCH_PATH)/retroarch.c \ $(RARCH_PATH)/thread.c \ main.c -LOCAL_CFLAGS = -marm -DANDROID -DHAVE_DYNAMIC -DHAVE_OPENGL -DHAVE_OPENGLES -DHAVE_OPENGLES2 -DHAVE_GLSL -DHAVE_ZLIB -DHAVE_RARCH_MAIN_WRAP -DINLINE=inline -DLSB_FIRST -D__LIBRETRO__ -DHAVE_CONFIGFILE=1 -DPACKAGE_VERSION=\"$(RARCH_VERSION)\" -std=gnu99 +LOCAL_CFLAGS = -marm -DANDROID -DHAVE_DYNAMIC -DHAVE_OPENGL -DHAVE_OPENGLES -DHAVE_OPENGLES2 -DHAVE_GLSL -DHAVE_ZLIB -DINLINE=inline -DLSB_FIRST -D__LIBRETRO__ -DHAVE_CONFIGFILE=1 -DPACKAGE_VERSION=\"$(RARCH_VERSION)\" -std=gnu99 LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -landroid -lEGL -lGLESv2 -llog -ldl -lz LOCAL_STATIC_LIBRARIES := android_native_app_glue diff --git a/android/native/jni/main.c b/android/native/jni/main.c index 5845f08b44..49a546e130 100644 --- a/android/native/jni/main.c +++ b/android/native/jni/main.c @@ -43,19 +43,6 @@ JNIEXPORT void JNICALL JNI_OnUnLoad( JavaVM *vm, void *pvt) RARCH_LOG("JNI_OnUnLoad.\n" ); } -/** - * Just the current frame in the display. - */ -static void engine_draw_frame(void) -{ - // Just fill the screen with a color. - glClearColor(((float)g_android.state.x)/g_android.width, g_android.state.angle, - ((float)g_android.state.y)/g_android.height, 1); - - gfx_ctx_clear(); - gfx_ctx_swap_buffers(); -} - /** * Process the next input event. */ @@ -86,12 +73,13 @@ static void engine_handle_cmd(struct android_app* app, int32_t cmd) break; case APP_CMD_INIT_WINDOW: // The window is being shown, get it ready. - if (g_android.app->window != NULL) + /*if (g_android.app->window != NULL) gfx_ctx_init(); + */ break; case APP_CMD_TERM_WINDOW: // The window is being hidden or closed, clean it up. - gfx_ctx_destroy(); + //gfx_ctx_destroy(); break; case APP_CMD_GAINED_FOCUS: // When our app gains focus, we start monitoring the accelerometer. @@ -142,6 +130,8 @@ static void android_get_char_argv(char *argv, size_t sizeof_argv, const char * a (*env)->ReleaseStringUTFChars(env, jsParam1, test_argv); } +#define MAX_ARGS 32 + /** * This is the main entry point of a native application that is using * android_native_app_glue. It runs in its own thread, with its own @@ -160,15 +150,15 @@ void android_main(struct android_app* state) state->onInputEvent = engine_handle_input; g_android.app = state; - char rom[512]; + char rom_path[512]; char libretro_path[512]; // Get arguments */ - android_get_char_argv(rom, sizeof(rom), "ROM", state); + android_get_char_argv(rom_path, sizeof(rom_path), "ROM", state); android_get_char_argv(libretro_path, sizeof(libretro_path), "LIBRETRO", state); RARCH_LOG("Checking arguments passed...\n"); - RARCH_LOG("ROM Filename: [%s].\n", rom); + RARCH_LOG("ROM Filename: [%s].\n", rom_path); RARCH_LOG("Libretro path: [%s].\n", libretro_path); // Prepare to monitor accelerometer @@ -181,53 +171,15 @@ void android_main(struct android_app* state) if (state->savedState != NULL) // We are starting with a previous saved state; restore from it. g_android.state = *(struct saved_state*)state->savedState; - // loop waiting for stuff to do. + int argc = 0; + char *argv[MAX_ARGS] = {NULL}; - while (1) - { - // Read all pending events. - int ident; - int events; - struct android_poll_source* source; + argv[argc++] = strdup("retroarch"); + argv[argc++] = strdup(rom_path); + argv[argc++] = strdup("-L"); + argv[argc++] = strdup(libretro_path); + argv[argc++] = strdup("-v"); - // If not animating, we will block forever waiting for events. - // If animating, we loop until all events are read, then continue - // to draw the next frame of animation. - while ((ident=ALooper_pollAll(g_android.animating ? 0 : -1, NULL, &events, - (void**)&source)) >= 0) - { - // Process this event. - if (source != NULL) - source->process(state, source); - - // If a sensor has data, process it now. - if (ident == LOOPER_ID_USER && g_android.accelerometerSensor != NULL) - { - ASensorEvent event; - while (ASensorEventQueue_getEvents(g_android.sensorEventQueue, &event, 1) > 0) - RARCH_WARN("accelerometer: x=%f y=%f z=%f.\n", event.acceleration.x, - event.acceleration.y, event.acceleration.z); - } - - // Check if we are exiting. - if (state->destroyRequested != 0) - { - gfx_ctx_destroy(); - return; - } - } - - if (g_android.animating) - { - // Done with events; draw next animation frame. - g_android.state.angle += .01f; - - if (g_android.state.angle > 1) - g_android.state.angle = 0; - - // Drawing is throttled to the screen update rate, so there - // is no need to do timing here. - engine_draw_frame(); - } - } + RARCH_LOG("Start RetroArch...\n"); + rarch_main(argc, argv); } diff --git a/gfx/context/androidegl_ctx.c b/gfx/context/androidegl_ctx.c index 78b5b1b731..3f005e72c4 100644 --- a/gfx/context/androidegl_ctx.c +++ b/gfx/context/androidegl_ctx.c @@ -162,11 +162,66 @@ bool gfx_ctx_init(void) void gfx_ctx_check_window(bool *quit, bool *resize, unsigned *width, unsigned *height, unsigned frame_count) { - (void)quit; - (void)resize; (void)width; (void)height; (void)frame_count; + + gl_t *gl = driver.video_data; + *quit = false; + *resize = false; + + // Read all pending events. + int ident; + int events; + struct android_poll_source* source; + struct android_app* state = g_android.app; + + // If not animating, we will block forever waiting for events. + // If animating, we loop until all events are read, then continue + // to draw the next frame of animation. + while ((ident=ALooper_pollAll(g_android.animating ? 0 : -1, NULL, &events, + (void**)&source)) >= 0) + { + // Process this event. + if (source != NULL) + source->process(state, source); + + // If a sensor has data, process it now. + if (ident == LOOPER_ID_USER && g_android.accelerometerSensor != NULL) + { + ASensorEvent event; + while (ASensorEventQueue_getEvents(g_android.sensorEventQueue, &event, 1) > 0) + RARCH_LOG("accelerometer: x=%f y=%f z=%f.\n", event.acceleration.x, + event.acceleration.y, event.acceleration.z); + } + + // Check if we are exiting. + if (state->destroyRequested != 0) + { + gl->quitting = true; + *quit = true; + return; + } + } + + if (g_android.animating) + { + // Done with events; draw next animation frame. + g_android.state.angle += .01f; + + if (g_android.state.angle > 1) + g_android.state.angle = 0; + + // Drawing is throttled to the screen update rate, so there + // is no need to do timing here. + //engine_draw_frame(); + } + + if (gl->quitting) + *quit = true; + + if (gl->should_resize) + *resize = true; } void gfx_ctx_swap_buffers(void)