view android/testproject/jni/app-android.c @ 4709:6dc26b9d8368

Tweaks to the libsdl side
author Paul Hunkin <paul@bieh.net>
date Fri, 18 Jun 2010 01:29:14 +1200
parents f3f65cb6a382
children aeac51289991
line wrap: on
line source

/*******************************************************************************
                               Headers
*******************************************************************************/
#include <jni.h>
#include <sys/time.h>
#include <time.h>
#include <android/log.h>
#include <stdint.h>

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include <pthread.h>

#include "importgl.h"
#include "egl.h"

/*******************************************************************************
                               Globals
*******************************************************************************/
int gAppAlive = 1;

static int sWindowWidth  = 320;
static int sWindowHeight = 480;
static int sDemoStopped  = 0;

static long _getTime(void){
	struct timeval  now;
	gettimeofday(&now, NULL);
	return (long)(now.tv_sec*1000 + now.tv_usec/1000);
}


/*******************************************************************************
                               Things used by libsdl
*******************************************************************************/
pthread_mutex_t mSDLRenderMutex;
pthread_cond_t mSDLRenderCondition;

EGLContext mContext;
EGLDisplay mDisplay;
EGLSurface mRead;
EGLSurface mDraw;
	
/*******************************************************************************
                      SDL thread
*******************************************************************************/
pthread_t mSDLThread = 0;

void* sdlThreadProc(void* args){
	__android_log_print(ANDROID_LOG_INFO, "SDL", "Thread Entry");

	if(!eglMakeCurrent(mDisplay, mDraw, mRead, mContext)){
		__android_log_print(ANDROID_LOG_INFO, "SDL", "Couldn't make current: 0x%x", eglGetError());
		return NULL;
	}
	
	return (void *)SDL_main();
}
   
/*******************************************************************************
                      Initialize the graphics state
*******************************************************************************/
void Java_org_libsdl_android_TestRenderer_nativeInit( JNIEnv*  env )
{
	importGLInit();

	gAppAlive    = 1;
	sDemoStopped = 0;

	__android_log_print(ANDROID_LOG_INFO, "SDL", "Entry point");

	pthread_mutex_init(&mSDLRenderMutex, NULL);
	pthread_cond_init (&mSDLRenderCondition, NULL);

	//Get some egl stuff we need
	mContext = eglGetCurrentContext();
	mDisplay = eglGetCurrentDisplay();
	mRead = eglGetCurrentSurface(EGL_READ);
	mDraw = eglGetCurrentSurface(EGL_DRAW);

	//We need to abandon our context so SDL can have it
	if(!eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)){
		__android_log_print(ANDROID_LOG_INFO, "SDL", "Couldn't abandon context: 0x%x", eglGetError());
		return NULL;
	}

	//Spin up the SDL thread
	int r = pthread_create(&mSDLThread, NULL, sdlThreadProc, NULL);

	if(r != 0){
		__android_log_print(ANDROID_LOG_INFO, "SDL", "Couldn't spawn thread: %d", r);
	}else{		
		__android_log_print(ANDROID_LOG_INFO, "SDL", "Started SDL thread");
	}

}

/*******************************************************************************
                                 Resize
*******************************************************************************/
void Java_org_libsdl_android_TestRenderer_nativeResize( JNIEnv*  env, 
														jobject  thiz, 
														jint w,
														jint h )
{
	sWindowWidth  = w;
	sWindowHeight = h;
	__android_log_print(ANDROID_LOG_INFO, "SDL", "resize w=%d h=%d", w, h);

}

/*******************************************************************************
                         Finalize (ie: shutdown)
*******************************************************************************/
void Java_org_libsdl_android_TestRenderer_nativeDone( JNIEnv*  env )
{

	//shut down the app

	importGLDeinit();

	__android_log_print(ANDROID_LOG_INFO, "SDL", "Finalize");
}

/*******************************************************************************
                   Pause (ie: stop as soon as possible)
*******************************************************************************/
void Java_org_libsdl_android_TestGLSurfaceView_nativePause( JNIEnv*  env )
{
	sDemoStopped = !sDemoStopped;
	if (sDemoStopped) {
		//we paused
		__android_log_print(ANDROID_LOG_INFO, "SDL", "Pause");
	} else {
		//we resumed
		__android_log_print(ANDROID_LOG_INFO, "SDL", "Resume");
	}
}

/*******************************************************************************
                     Render the next frame
*******************************************************************************/

void Java_org_libsdl_android_TestRenderer_nativeRender( JNIEnv*  env )
{    
	//TODO: Render here

	pthread_mutex_lock(&mSDLRenderMutex);
	pthread_cond_signal(&mSDLRenderCondition); //wake up the SDL thread
	pthread_mutex_unlock(&mSDLRenderMutex);

	//__android_log_print(ANDROID_LOG_INFO, "SDL", "Unlocked");

}