From 606b0cda7f08e9b8589423fbfa69648e326309ff Mon Sep 17 00:00:00 2001 From: Sam Lantinga <slouken@libsdl.org> Date: Thu, 6 Jan 2011 16:11:21 -0800 Subject: [PATCH] Build the SDL library as a shared object on Android, so it will work correctly with SDL_image and SDL_ttf. --- Android.mk | 41 ++ Makefile.android | 58 -- README.android | 43 +- android/config.cfg.example | 8 - android/project/AndroidManifest.xml | 15 - android/project/build.properties | 17 - android/project/build.xml | 67 -- android/project/default.properties | 11 - android/project/jni/Android.mk | 18 - android/project/jni/lesson05.c | 574 ------------------ android/project/local.properties | 10 - android/project/res/drawable-hdpi/icon.png | Bin 4147 -> 0 bytes android/project/res/drawable-ldpi/icon.png | Bin 1723 -> 0 bytes android/project/res/drawable-mdpi/icon.png | Bin 2574 -> 0 bytes android/project/res/layout/main.xml | 13 - android/project/res/values/strings.xml | 4 - .../src/org/libsdl/app/SDLActivity.java | 388 ------------ include/SDL_config_android.h | 2 +- .../SDL_android.cpp | 164 +++-- src/main/android/SDL_android_main.cpp | 30 + 20 files changed, 178 insertions(+), 1285 deletions(-) create mode 100755 Android.mk delete mode 100755 Makefile.android delete mode 100644 android/config.cfg.example delete mode 100644 android/project/AndroidManifest.xml delete mode 100644 android/project/build.properties delete mode 100644 android/project/build.xml delete mode 100644 android/project/default.properties delete mode 100644 android/project/jni/Android.mk delete mode 100644 android/project/jni/lesson05.c delete mode 100644 android/project/local.properties delete mode 100644 android/project/res/drawable-hdpi/icon.png delete mode 100644 android/project/res/drawable-ldpi/icon.png delete mode 100644 android/project/res/drawable-mdpi/icon.png delete mode 100644 android/project/res/layout/main.xml delete mode 100644 android/project/res/values/strings.xml delete mode 100644 android/project/src/org/libsdl/app/SDLActivity.java rename android/project/jni/android-support.cpp => src/SDL_android.cpp (74%) create mode 100644 src/main/android/SDL_android_main.cpp diff --git a/Android.mk b/Android.mk new file mode 100755 index 00000000..12f534de --- /dev/null +++ b/Android.mk @@ -0,0 +1,41 @@ +LOCAL_PATH := $(call my-dir) + +########################### +# +# SDL shared library +# +########################### + +include $(CLEAR_VARS) + +LOCAL_MODULE := SDL + +LOCAL_C_INCLUDES := $(LOCAL_PATH)/include + +LOCAL_SRC_FILES := src/SDL_android.cpp \ + $(subst $(LOCAL_PATH)/,, \ + $(wildcard $(LOCAL_PATH)/src/*.c) \ + $(wildcard $(LOCAL_PATH)/src/audio/*.c) \ + $(wildcard $(LOCAL_PATH)/src/cpuinfo/*.c) \ + $(wildcard $(LOCAL_PATH)/src/events/*.c) \ + $(wildcard $(LOCAL_PATH)/src/file/*.c) \ + $(wildcard $(LOCAL_PATH)/src/joystick/*.c) \ + $(wildcard $(LOCAL_PATH)/src/haptic/*.c) \ + $(wildcard $(LOCAL_PATH)/src/stdlib/*.c) \ + $(wildcard $(LOCAL_PATH)/src/thread/*.c) \ + $(wildcard $(LOCAL_PATH)/src/timer/*.c) \ + $(wildcard $(LOCAL_PATH)/src/video/*.c) \ + $(wildcard $(LOCAL_PATH)/src/power/*.c) \ + $(wildcard $(LOCAL_PATH)/src/audio/android/*.c) \ + $(wildcard $(LOCAL_PATH)/src/audio/dummy/*.c) \ + $(wildcard $(LOCAL_PATH)/src/video/android/*.c) \ + $(wildcard $(LOCAL_PATH)/src/joystick/android/*.c) \ + $(wildcard $(LOCAL_PATH)/src/haptic/dummy/*.c) \ + $(wildcard $(LOCAL_PATH)/src/atomic/dummy/*.c) \ + $(wildcard $(LOCAL_PATH)/src/thread/pthread/*.c) \ + $(wildcard $(LOCAL_PATH)/src/timer/unix/*.c) \ + $(wildcard $(LOCAL_PATH)/src/loadso/dlopen/*.c)) + +LOCAL_LDLIBS := -ldl -lGLESv1_CM -llog + +include $(BUILD_SHARED_LIBRARY) diff --git a/Makefile.android b/Makefile.android deleted file mode 100755 index 6666b910..00000000 --- a/Makefile.android +++ /dev/null @@ -1,58 +0,0 @@ -# Makefile to build the SDL library - -include ./android/config.cfg #get ANDROID_NDK, ANDROID_NDK_HOST - -# For NDK R4 -TOOLS_PATH=$(ANDROID_NDK)/build/prebuilt/$(ANDROID_NDK_HOST)/arm-eabi-4.2.1/bin -ANDROID_INCLUDES = -I$(ANDROID_NDK)/build/platforms/android-4/arch-arm/usr/include - -# For NDK R5 -#TOOLS_PATH=$(ANDROID_NDK)/toolchains/arm-eabi-4.4.0/prebuilt/$(ANDROID_NDK_HOST)/bin -#ANDROID_INCLUDES = -I$(ANDROID_NDK)/platforms/android-4/arch-arm/usr/include - -INCLUDE = -I./include -CFLAGS = -g -O2 -fno-short-enums $(INCLUDE) $(ANDROID_INCLUDES) -DANDROID -DANDROID_NDK -static - -AR = $(TOOLS_PATH)/arm-eabi-ar -RANLIB = $(TOOLS_PATH)/arm-eabi-ranlib -CC = $(TOOLS_PATH)/arm-eabi-gcc - - -CONFIG_H = include/SDL_config.h -TARGET = libSDL.a -SOURCES = \ - src/*.c \ - src/audio/*.c \ - src/cpuinfo/*.c \ - src/events/*.c \ - src/file/*.c \ - src/joystick/*.c \ - src/haptic/*.c \ - src/stdlib/*.c \ - src/thread/*.c \ - src/timer/*.c \ - src/video/*.c \ - src/power/*.c \ - src/audio/android/*.c \ - src/audio/dummy/*.c \ - src/video/android/*.c \ - src/joystick/android/*.c \ - src/haptic/dummy/*.c \ - src/atomic/dummy/*.c \ - src/thread/pthread/*.c \ - src/timer/unix/*.c \ - src/loadso/dummy/*.c \ - -OBJECTS = $(shell echo $(SOURCES) | sed -e 's,\.c,\.o,g') - -all: $(TARGET) - -$(TARGET): $(CONFIG_H) $(OBJECTS) - $(AR) crv $@ $^ - $(RANLIB) $@ - -$(CONFIG_H): - cp $(CONFIG_H).default $(CONFIG_H) - -clean: - rm -f $(TARGET) $(OBJECTS) diff --git a/README.android b/README.android index 23b13e68..dade7eea 100644 --- a/README.android +++ b/README.android @@ -2,7 +2,8 @@ Simple DirectMedia Layer for Android ================================================================================ -Requirements: Android NDK r4 or later +Requirements: Android SDK and Android NDK r4 or later +http://developer.android.com/ ================================================================================ How the port works @@ -16,26 +17,44 @@ Java project, along with some C support code that communicates with Java - This eventually produces a standard Android .apk package +================================================================================ + Building an app +================================================================================ +Instructions: +1. Copy the android-project directory wherever you want your Android project to go +2. Move this SDL directory into the <project>/jni directory +3. Place your application source files in the <project>/jni/src directory +4. Edit <project>/jni/src/Android.mk to include your source files +5. Run 'ndk-build' (a script provided by the NDK). This compiles the C source +If you want to use the Eclipse IDE, skip to the Eclipse section below. + +6. Edit <project>/local.properties to point to the Android SDK directory +7. Run 'ant debug' in android/project. This compiles the .java and eventually +creates a .apk with the native code embedded +8. 'ant install' will push the apk to the device or emulator (if connected) ================================================================================ - Building an app + Using Eclipse ================================================================================ -Instructions: -1. Edit android/config.cfg to point to the location of the NDK -2. Run 'make -f Makefile.android'. If all goes well, libsdl.a should be created -3. Place your application source files in android/project/jni -4. Edit the Android.mk to include your source files -5. Run 'ndk-build' (a script provided by the NDK). This compiles the C source -6. Edit project/local.properties to point to the SDK directory -6. Run 'ant debug' in android/project. This compiles the .java and eventually -creates a .apk with the C source embedded -7. 'ant install' will push the apk to the device or emulator (if connected) +NEED CONTENT +================================================================================ + Loading files +================================================================================ + +NEED CONTENT + + +================================================================================ + Troubleshooting +================================================================================ + +NEED CONTENT ================================================================================ diff --git a/android/config.cfg.example b/android/config.cfg.example deleted file mode 100644 index a9bde985..00000000 --- a/android/config.cfg.example +++ /dev/null @@ -1,8 +0,0 @@ -# This file sets up paths needed to find the NDK build tools. -# Edit it appropriately for your configuration and save it as "config.cfg". - -# This should be the full path to the Android NDK -ANDROID_NDK := /Users/hercules/eclipse/android-ndk-r5 - -# This should be "linux-x86" for linux, "darwin-x86" for mac -ANDROID_NDK_HOST := darwin-x86 diff --git a/android/project/AndroidManifest.xml b/android/project/AndroidManifest.xml deleted file mode 100644 index 18223258..00000000 --- a/android/project/AndroidManifest.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="org.libsdl.app" - android:versionCode="1" - android:versionName="1.0"> - <application android:label="@string/app_name" android:icon="@drawable/icon"> - <activity android:name="SDLActivity" - android:label="@string/app_name"> - <intent-filter> - <action android:name="android.intent.action.MAIN" /> - <category android:name="android.intent.category.LAUNCHER" /> - </intent-filter> - </activity> - </application> -</manifest> diff --git a/android/project/build.properties b/android/project/build.properties deleted file mode 100644 index edc7f230..00000000 --- a/android/project/build.properties +++ /dev/null @@ -1,17 +0,0 @@ -# This file is used to override default values used by the Ant build system. -# -# This file must be checked in Version Control Systems, as it is -# integral to the build system of your project. - -# This file is only used by the Ant script. - -# You can use this to override default values such as -# 'source.dir' for the location of your java source folder and -# 'out.dir' for the location of your output folder. - -# You can also use it define how the release builds are signed by declaring -# the following properties: -# 'key.store' for the location of your keystore and -# 'key.alias' for the name of the key to use. -# The password will be asked during the build when you use the 'release' target. - diff --git a/android/project/build.xml b/android/project/build.xml deleted file mode 100644 index 37b37680..00000000 --- a/android/project/build.xml +++ /dev/null @@ -1,67 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project name="SDLApp" default="help"> - - <!-- The local.properties file is created and updated by the 'android' tool. - It contains the path to the SDK. It should *NOT* be checked in in Version - Control Systems. --> - <property file="local.properties" /> - - <!-- The build.properties file can be created by you and is never touched - by the 'android' tool. This is the place to change some of the default property values - used by the Ant rules. - Here are some properties you may want to change/update: - - application.package - the name of your application package as defined in the manifest. Used by the - 'uninstall' rule. - source.dir - the name of the source directory. Default is 'src'. - out.dir - the name of the output directory. Default is 'bin'. - - Properties related to the SDK location or the project target should be updated - using the 'android' tool with the 'update' action. - - This file is an integral part of the build system for your application and - should be checked in in Version Control Systems. - - --> - <property file="build.properties" /> - - <!-- The default.properties file is created and updated by the 'android' tool, as well - as ADT. - This file is an integral part of the build system for your application and - should be checked in in Version Control Systems. --> - <property file="default.properties" /> - - <!-- Custom Android task to deal with the project target, and import the proper rules. - This requires ant 1.6.0 or above. --> - <path id="android.antlibs"> - <pathelement path="${sdk.dir}/tools/lib/anttasks.jar" /> - <pathelement path="${sdk.dir}/tools/lib/sdklib.jar" /> - <pathelement path="${sdk.dir}/tools/lib/androidprefs.jar" /> - <pathelement path="${sdk.dir}/tools/lib/apkbuilder.jar" /> - <pathelement path="${sdk.dir}/tools/lib/jarutils.jar" /> - </path> - - <taskdef name="setup" - classname="com.android.ant.SetupTask" - classpathref="android.antlibs" /> - - <!-- Execute the Android Setup task that will setup some properties specific to the target, - and import the build rules files. - - The rules file is imported from - <SDK>/platforms/<target_platform>/templates/android_rules.xml - - To customize some build steps for your project: - - copy the content of the main node <project> from android_rules.xml - - paste it in this build.xml below the <setup /> task. - - disable the import by changing the setup task below to <setup import="false" /> - - This will ensure that the properties are setup correctly but that your customized - build steps are used. - --> - <setup /> - -</project> diff --git a/android/project/default.properties b/android/project/default.properties deleted file mode 100644 index 9d79b12c..00000000 --- a/android/project/default.properties +++ /dev/null @@ -1,11 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system use, -# "build.properties", and override values to adapt the script to your -# project structure. - -# Project target. -target=android-4 diff --git a/android/project/jni/Android.mk b/android/project/jni/Android.mk deleted file mode 100644 index 585f5f34..00000000 --- a/android/project/jni/Android.mk +++ /dev/null @@ -1,18 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_MODULE := sdlapp -SDL := ../../../ - -LOCAL_CFLAGS := -DANDROID_NDK \ - -DDISABLE_IMPORTGL \ - -I$(SDL)/include - -LOCAL_SRC_FILES := \ - android-support.cpp \ - lesson05.c \ - -LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog -lSDL -lgcc -L$(SDL) - -include $(BUILD_SHARED_LIBRARY) diff --git a/android/project/jni/lesson05.c b/android/project/jni/lesson05.c deleted file mode 100644 index 01560dfd..00000000 --- a/android/project/jni/lesson05.c +++ /dev/null @@ -1,574 +0,0 @@ -/* - * This code was created by Jeff Molofee '99 - * (ported to Linux/SDL by Ti Leggett '01) - * - * If you've found this code useful, please let me know. - * - * Visit Jeff at http://nehe.gamedev.net/ - * - * or for port-specific comments, questions, bugreports etc. - * email to leggett@eecs.tulane.edu - */ - -#include <stdio.h> -#include <stdlib.h> -#include <math.h> - -#include <signal.h> - -#include <android/log.h> - - -#ifdef ANDROID -#include <GLES/gl.h> -#else -#include <GL/gl.h> -#include <GL/glu.h> -#endif -#include "SDL.h" - -/* screen width, height, and bit depth */ -#define SCREEN_WIDTH 320 -#define SCREEN_HEIGHT 430 -#define SCREEN_BPP 16 - -/* Define our booleans */ -#define TRUE 1 -#define FALSE 0 - -/* This is our SDL surface */ -SDL_Surface *surface; - -int rotation = 0; - - -/************************************** - gluperspective implementation -**************************************/ -void gluPerspective(double fovy, double aspect, double zNear, double zFar){ - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - double xmin, xmax, ymin, ymax; - ymax = zNear * tan(fovy * M_PI / 360.0); - ymin = -ymax; - xmin = ymin * aspect; - xmax = ymax * aspect; - glFrustumf(xmin, xmax, ymin, ymax, zNear, zFar); -} - - -/************************************** - glulookat implementation -**************************************/ -void gluLookAt(GLfloat eyex, GLfloat eyey, GLfloat eyez, - GLfloat centerx, GLfloat centery, GLfloat centerz, - GLfloat upx, GLfloat upy, GLfloat upz) -{ - GLfloat m[16]; - GLfloat x[3], y[3], z[3]; - GLfloat mag; - - /* Make rotation matrix */ - - /* Z vector */ - z[0] = eyex - centerx; - z[1] = eyey - centery; - z[2] = eyez - centerz; - mag = sqrt(z[0] * z[0] + z[1] * z[1] + z[2] * z[2]); - if (mag) { /* mpichler, 19950515 */ - z[0] /= mag; - z[1] /= mag; - z[2] /= mag; - } - - /* Y vector */ - y[0] = upx; - y[1] = upy; - y[2] = upz; - - /* X vector = Y cross Z */ - x[0] = y[1] * z[2] - y[2] * z[1]; - x[1] = -y[0] * z[2] + y[2] * z[0]; - x[2] = y[0] * z[1] - y[1] * z[0]; - - /* Recompute Y = Z cross X */ - y[0] = z[1] * x[2] - z[2] * x[1]; - y[1] = -z[0] * x[2] + z[2] * x[0]; - y[2] = z[0] * x[1] - z[1] * x[0]; - - /* mpichler, 19950515 */ - /* cross product gives area of parallelogram, which is < 1.0 for - * non-perpendicular unit-length vectors; so normalize x, y here - */ - - mag = sqrt(x[0] * x[0] + x[1] * x[1] + x[2] * x[2]); - if (mag) { - x[0] /= mag; - x[1] /= mag; - x[2] /= mag; - } - - mag = sqrt(y[0] * y[0] + y[1] * y[1] + y[2] * y[2]); - if (mag) { - y[0] /= mag; - y[1] /= mag; - y[2] /= mag; - } - -#define M(row,col) m[col*4+row] - M(0, 0) = x[0]; - M(0, 1) = x[1]; - M(0, 2) = x[2]; - M(0, 3) = 0.0; - M(1, 0) = y[0]; - M(1, 1) = y[1]; - M(1, 2) = y[2]; - M(1, 3) = 0.0; - M(2, 0) = z[0]; - M(2, 1) = z[1]; - M(2, 2) = z[2]; - M(2, 3) = 0.0; - M(3, 0) = 0.0; - M(3, 1) = 0.0; - M(3, 2) = 0.0; - M(3, 3) = 1.0; -#undef M - glMultMatrixf(m); - - /* Translate Eye to Origin */ - glTranslatef(-eyex, -eyey, -eyez); - -} - - - - - -/* function to release/destroy our resources and restoring the old desktop */ -void Quit( int returnCode ) -{ - /* clean up the window */ - SDL_Quit( ); - - /* and exit appropriately */ - exit( returnCode ); -} - -/* function to reset our viewport after a window resize */ -int resizeWindow( int width, int height ) -{ - /* Height / width ration */ - GLfloat ratio; - - /* Protect against a divide by zero */ - if ( height == 0 ) - height = 1; - - ratio = ( GLfloat )width / ( GLfloat )height; - - /* Setup our viewport. */ - glViewport( 0, 0, ( GLsizei )width, ( GLsizei )height ); - - /* change to the projection matrix and set our viewing volume. */ - glMatrixMode( GL_PROJECTION ); - glLoadIdentity( ); - - /* Set our perspective */ - gluPerspective( 45.0f, ratio, 0.1f, 100.0f ); - - /* Make sure we're chaning the model view and not the projection */ - glMatrixMode( GL_MODELVIEW ); - - /* Reset The View */ - glLoadIdentity( ); - - return( TRUE ); -} - -/* function to handle key press events */ -void handleKeyPress( SDL_keysym *keysym ) -{ - switch ( keysym->sym ) - { - case SDLK_ESCAPE: - /* ESC key was pressed */ - Quit( 0 ); - break; - case SDLK_F1: - /* F1 key was pressed - * this toggles fullscreen mode - */ - SDL_WM_ToggleFullScreen( surface ); - break; - case SDLK_LEFT: - rotation -= 30; - break; - - case SDLK_RIGHT: - rotation += 30; - break; - - default: - break; - } - - __android_log_print(ANDROID_LOG_INFO, "SDL","Keycode: %d, %d, %d\n", keysym->sym, SDLK_LEFT, SDLK_RIGHT); - - return; -} - -/* general OpenGL initialization function */ -int initGL( GLvoid ) -{ - - /* Enable smooth shading */ - glShadeModel( GL_SMOOTH ); - - /* Set the background black */ - glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); - - /* Depth buffer setup */ - //glClearDepth( 1.0f ); - - /* Enables Depth Testing */ - glEnable( GL_DEPTH_TEST ); - - /* The Type Of Depth Test To Do */ - glDepthFunc( GL_LEQUAL ); - - /* Really Nice Perspective Calculations */ - glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); - - return( TRUE ); -} - -/* Here goes our drawing code */ -int drawGLScene( GLvoid ) -{ - - static int Frames = 0; - static int T0 = 0; - - glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); - - glClearColorx(0,0,0,255); - glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - gluPerspective(45, (float)SCREEN_WIDTH / SCREEN_HEIGHT, 0.5f, 150); - - glMatrixMode(GL_MODELVIEW); - - glLoadIdentity(); - - //Camera - gluLookAt(0,0,5, 0,0,0, 0,1,0); - - //Draw a triangle - //glRotatef(iRot, 0, 1, 0); - - glRotatef( rotation, 0.0f, 1.0f, 0.0f ); - - - glEnableClientState (GL_VERTEX_ARRAY); - glEnableClientState (GL_COLOR_ARRAY); - - /* Rotate The Triangle On The Y axis ( NEW ) */ - //glRotatef( Frames % 360, 0.0f, 1.0f, 0.0f ); - - /* GLES variant of drawing a triangle */ - const GLfloat triVertices[][9] = { - { /* Front Triangle */ - 0.0f, 1.0f, 0.0f, /* Top Of Triangle */ - -1.0f, -1.0f, 1.0f, /* Left Of Triangle */ - 1.0f, -1.0f, 1.0f /* Right Of Triangle */ - }, { /* Right Triangle */ - 0.0f, 1.0f, 0.0f, /* Top Of Triangle */ - 1.0f, -1.0f, 1.0f, /* Left Of Triangle */ - 1.0f, -1.0f, -1.0f /* Right Of Triangle */ - }, { /* Back Triangle */ - 0.0f, 1.0f, 0.0f, /* Top Of Triangle */ - 1.0f, -1.0f, -1.0f, /* Left Of Triangle */ - -1.0f, -1.0f, -1.0f /* Right Of Triangle */ - }, { /* Left Triangle */ - 0.0f, 1.0f, 0.0f, /* Top Of Triangle */ - -1.0f, -1.0f, -1.0f, /* Left Of Triangle */ - -1.0f, -1.0f, 1.0f /* Right Of Triangle */ - } - }; - - /* unlike GL, GLES does not support RGB. We have to use RGBA instead */ - const GLfloat triColors[][12] = { - { /* Front triangle */ - 1.0f, 0.0f, 0.0f, 1.0f, /* Red */ - 0.0f, 1.0f, 0.0f, 1.0f, /* Green */ - 0.0f, 0.0f, 1.0f, 1.0f /* Blue */ - }, { /* Right triangle */ - 1.0f, 0.0f, 0.0f, 1.0f, /* Red */ - 0.0f, 0.0f, 1.0f, 1.0f, /* Blue */ - 0.0f, 1.0f, 0.0f, 1.0f /* Green */ - }, { /* Back triangle */ - 1.0f, 0.0f, 0.0f, 1.0f, /* Red */ - 0.0f, 1.0f, 0.0f, 1.0f, /* Green */ - 0.0f, 0.0f, 1.0f, 1.0f /* Blue */ - }, { /* Left triangle */ - 1.0f, 0.0f, 0.0f, 1.0f, /* Red */ - 0.0f, 0.0f, 1.0f, 1.0f, /* Blue */ - 0.0f, 1.0f, 0.0f, 1.0f /* Green */ - } - }; - - glEnableClientState(GL_COLOR_ARRAY); - - int tri=0; - - /* Loop through all Triangles */ - for(tri=0;tri<sizeof(triVertices)/(9*sizeof(GLfloat));tri++) - { - glVertexPointer(3, GL_FLOAT, 0, triVertices[tri]); - glColorPointer(4, GL_FLOAT, 0, triColors[tri]); - - glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); - } - - //__android_log_print(ANDROID_LOG_INFO, "SDL", "render %d", Frames++); - - /* Draw it to the screen */ - SDL_GL_SwapBuffers( ); - - /* Gather our frames per second */ - Frames++; - { - GLint t = SDL_GetTicks(); - if (t - T0 >= 5000) { - GLfloat seconds = (t - T0) / 1000.0; - GLfloat fps = Frames / seconds; - __android_log_print(ANDROID_LOG_INFO, "SDL","%d frames in %g seconds = %g FPS\n", Frames, seconds, fps); - T0 = t; - Frames = 0; - } - } - - rotation++; - - return( TRUE ); -} - - -struct -{ - SDL_AudioSpec spec; - Uint8 *sound; /* Pointer to wave data */ - Uint32 soundlen; /* Length of wave data */ - int soundpos; /* Current play position */ -} wave; - -void SDLCALL -fillerup(void *unused, Uint8 * stream, int len) -{ - __android_log_print(ANDROID_LOG_INFO, "SDL","FILLERUP\n"); - - Uint8 *waveptr; - int waveleft; - - /* Set up the pointers */ - waveptr = wave.sound + wave.soundpos; - waveleft = wave.soundlen - wave.soundpos; - - /* Go! */ - while (waveleft <= len) { - SDL_memcpy(stream, waveptr, waveleft); - stream += waveleft; - len -= waveleft; - waveptr = wave.sound; - waveleft = wave.soundlen; - wave.soundpos = 0; - } - SDL_memcpy(stream, waveptr, len); - wave.soundpos += len; -} - -void testAudio(){ - - const char *file = "/sdcard/sample.wav"; - - /* Load the SDL library */ - if (SDL_Init(SDL_INIT_AUDIO) < 0) { - __android_log_print(ANDROID_LOG_INFO, "SDL","Couldn't initialize SDL Audio: %s\n", SDL_GetError()); - return; - }else{ - __android_log_print(ANDROID_LOG_INFO, "SDL","Init audio ok\n"); - } - - /* Load the wave file into memory */ - if (SDL_LoadWAV(file, &wave.spec, &wave.sound, &wave.soundlen) == NULL) { - __android_log_print(ANDROID_LOG_INFO, "SDL", "Couldn't load %s: %s\n", file, SDL_GetError()); - return; - } - - wave.spec.callback = fillerup; - - __android_log_print(ANDROID_LOG_INFO, "SDL","Loaded: %d\n", wave.soundlen); - - - /* Initialize fillerup() variables */ - if (SDL_OpenAudio(&wave.spec, NULL) < 0) { - __android_log_print(ANDROID_LOG_INFO, "SDL", "Couldn't open audio: %s\n", SDL_GetError()); - SDL_FreeWAV(wave.sound); - return; - } - - __android_log_print(ANDROID_LOG_INFO, "SDL","Using audio driver: %s\n", SDL_GetCurrentAudioDriver()); - - /* Let the audio run */ - SDL_PauseAudio(0); - - __android_log_print(ANDROID_LOG_INFO, "SDL","Playing\n"); - - while (SDL_GetAudioStatus() == SDL_AUDIO_PLAYING){ - //__android_log_print(ANDROID_LOG_INFO, "SDL","Still playing\n"); - SDL_Delay(100); - } - - __android_log_print(ANDROID_LOG_INFO, "SDL","Closing down\n"); - - /* Clean up on signal */ - SDL_CloseAudio(); - SDL_FreeWAV(wave.sound); -} - -int SDL_main( int argc, char **argv ) -{ - - __android_log_print(ANDROID_LOG_INFO, "SDL","entry\n"); - - /* Flags to pass to SDL_SetVideoMode */ - int videoFlags; - /* main loop variable */ - int done = FALSE; - /* used to collect events */ - SDL_Event event; - /* this holds some info about our display */ - const SDL_VideoInfo *videoInfo; - /* whether or not the window is active */ - int isActive = TRUE; - - /* initialize SDL */ - if ( SDL_Init( SDL_INIT_VIDEO ) < 0 ) - { - __android_log_print(ANDROID_LOG_INFO, "SDL", "Video initialization failed: %s\n", - SDL_GetError( ) ); - Quit( 1 ); - } - - /* Fetch the video info */ - videoInfo = SDL_GetVideoInfo( ); - - if ( !videoInfo ) - { - __android_log_print(ANDROID_LOG_INFO, "SDL", "Video query failed: %s\n", - SDL_GetError( ) ); - Quit( 1 ); - } - - /* the flags to pass to SDL_SetVideoMode */ - videoFlags = SDL_OPENGL; /* Enable OpenGL in SDL */ - videoFlags |= SDL_GL_DOUBLEBUFFER; /* Enable double buffering */ - videoFlags |= SDL_HWPALETTE; /* Store the palette in hardware */ - videoFlags |= SDL_RESIZABLE; /* Enable window resizing */ - - /* This checks to see if surfaces can be stored in memory */ - if ( videoInfo->hw_available ) - videoFlags |= SDL_HWSURFACE; - else - videoFlags |= SDL_SWSURFACE; - - /* This checks if hardware blits can be done */ - if ( videoInfo->blit_hw ) - videoFlags |= SDL_HWACCEL; - - /* Sets up OpenGL double buffering */ - SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); - - /* get a SDL surface */ - surface = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, - videoFlags ); - - /* Verify there is a surface */ - if ( !surface ) - { - __android_log_print(ANDROID_LOG_INFO, "SDL", "Video mode set failed: %s\n", SDL_GetError( ) ); - Quit( 1 ); - } - - __android_log_print(ANDROID_LOG_INFO, "SDL","Made a video mode!\n"); - - /* initialize OpenGL */ - initGL( ); - - /* resize the initial window */ - resizeWindow( SCREEN_WIDTH, SCREEN_HEIGHT ); - - - //testAudio(); - - - /* wait for events */ - while ( !done ) - { - /* handle the events in the queue */ - - while ( SDL_PollEvent( &event ) ) - { - switch( event.type ) - { - case SDL_ACTIVEEVENT: - /* Something's happend with our focus - * If we lost focus or we are iconified, we - * shouldn't draw the screen - */ - if ( event.active.gain == 0 ) - isActive = FALSE; - else - isActive = TRUE; - break; - case SDL_VIDEORESIZE: - /* handle resize event */ - surface = SDL_SetVideoMode( event.resize.w, - event.resize.h, - 16, videoFlags ); - if ( !surface ) - { - __android_log_print(ANDROID_LOG_INFO, "SDL","Could not get a surface after resize: %s\n", SDL_GetError( ) ); - Quit( 1 ); - } - resizeWindow( event.resize.w, event.resize.h ); - break; - case SDL_KEYDOWN: - /* handle key presses */ - handleKeyPress( &event.key.keysym ); - break; - case SDL_QUIT: - /* handle quit requests */ - done = TRUE; - __android_log_print(ANDROID_LOG_INFO, "SDL","App is shutting down\n"); - break; - default: - break; - } - } - - /* draw the scene */ - if ( isActive ) - drawGLScene( ); - } - - /* clean ourselves up and exit */ - Quit( 0 ); - - /* Should never get here */ - return( 0 ); -} - - diff --git a/android/project/local.properties b/android/project/local.properties deleted file mode 100644 index 27accedc..00000000 --- a/android/project/local.properties +++ /dev/null @@ -1,10 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must *NOT* be checked in Version Control Systems, -# as it contains information specific to your local configuration. - -# location of the SDK. This is only used by Ant -# For customization when using a Version Control System, please read the -# header note. -sdk.dir=/home/paul/Projects/gsoc/sdk/android-sdk-linux_86 diff --git a/android/project/res/drawable-hdpi/icon.png b/android/project/res/drawable-hdpi/icon.png deleted file mode 100644 index 8074c4c571b8cd19e27f4ee5545df367420686d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4147 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 diff --git a/android/project/res/drawable-ldpi/icon.png b/android/project/res/drawable-ldpi/icon.png deleted file mode 100644 index 1095584ec21f71cd0afc9e0993aa2209671b590c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1723 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 Rn%e*X002ovPDHLkV1g`*Fem^3 diff --git a/android/project/res/drawable-mdpi/icon.png b/android/project/res/drawable-mdpi/icon.png deleted file mode 100644 index a07c69fa5a0f4da5d5efe96eea12a543154dbab6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2574 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 diff --git a/android/project/res/layout/main.xml b/android/project/res/layout/main.xml deleted file mode 100644 index 123c4b6e..00000000 --- a/android/project/res/layout/main.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="vertical" - android:layout_width="fill_parent" - android:layout_height="fill_parent" - > -<TextView - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:text="Hello World, SDLActivity" - /> -</LinearLayout> - diff --git a/android/project/res/values/strings.xml b/android/project/res/values/strings.xml deleted file mode 100644 index 17e33264..00000000 --- a/android/project/res/values/strings.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="app_name">SDLActivity</string> -</resources> diff --git a/android/project/src/org/libsdl/app/SDLActivity.java b/android/project/src/org/libsdl/app/SDLActivity.java deleted file mode 100644 index 07d750e8..00000000 --- a/android/project/src/org/libsdl/app/SDLActivity.java +++ /dev/null @@ -1,388 +0,0 @@ -package org.libsdl.app; - -import javax.microedition.khronos.egl.EGLConfig; -import javax.microedition.khronos.opengles.GL10; -import javax.microedition.khronos.egl.*; - -import android.app.*; -import android.content.*; -import android.view.*; -import android.os.*; -import android.util.Log; -import android.graphics.*; -import android.text.method.*; -import android.text.*; -import android.media.*; -import android.hardware.*; -import android.content.*; - -import java.lang.*; - - -/** - SDL Activity -*/ -public class SDLActivity extends Activity { - - //Main components - private static SDLActivity mSingleton; - private static SDLSurface mSurface; - - //Audio - private static AudioTrack mAudioTrack; - private static boolean bAudioIsEnabled; - - //Sensors - private static boolean bAccelIsEnabled; - - //feature IDs. Must match up on the C side as well. - private static int FEATURE_AUDIO = 1; - private static int FEATURE_ACCEL = 2; - - //Load the .so - static { - System.loadLibrary("sdlapp"); - } - - //Setup - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - //So we can call stuff from static callbacks - mSingleton = this; - - //Set up the surface - mSurface = new SDLSurface(getApplication()); - setContentView(mSurface); - SurfaceHolder holder = mSurface.getHolder(); - holder.setType(SurfaceHolder.SURFACE_TYPE_GPU); - - } - - //Audio - public static boolean initAudio(){ - - //blah. Hardcoded things are bad. FIXME when we have more sound stuff - //working properly. - mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, - 11025, - AudioFormat.CHANNEL_CONFIGURATION_MONO, - AudioFormat.ENCODING_PCM_8BIT, - 2048, - AudioTrack.MODE_STREAM); - bAudioIsEnabled = true; - return true; - } - - //Accel - public static boolean initAccel(){ - mSurface.enableSensor(Sensor.TYPE_ACCELEROMETER, true); - bAccelIsEnabled = true; - return true; - } - - public static boolean closeAccel(){ - mSurface.enableSensor(Sensor.TYPE_ACCELEROMETER, false); - bAccelIsEnabled = false; - return true; - } - - - //Events - protected void onPause() { - super.onPause(); - } - - protected void onResume() { - super.onResume(); - } - - - - - - //C functions we call - public static native void nativeInit(); - public static native void nativeQuit(); - public static native void nativeSetScreenSize(int width, int height); - public static native void onNativeKeyDown(int keycode); - public static native void onNativeKeyUp(int keycode); - public static native void onNativeTouch(int action, float x, - float y, float p); - public static native void onNativeResize(int x, int y, int format); - public static native void onNativeAccel(float x, float y, float z); - - - - //Java functions called from C - private static void createGLContext(){ - mSurface.initEGL(); - } - - public static void flipBuffers(){ - mSurface.flipEGL(); - } - - public static void updateAudio(byte [] buf){ - - if(mAudioTrack == null){ - return; - } - - mAudioTrack.write(buf, 0, buf.length); - mAudioTrack.play(); - - Log.v("SDL","Played some audio"); - } - - public static void enableFeature(int featureid, int enabled){ - Log.v("SDL","Feature " + featureid + " = " + enabled); - - //Yuck. This is all horribly inelegent. If it gets to more than a few - //'features' I'll rip this out and make something nicer, I promise :) - if(featureid == FEATURE_AUDIO){ - if(enabled == 1){ - initAudio(); - }else{ - //We don't have one of these yet... - //closeAudio(); - } - } - - else if(featureid == FEATURE_ACCEL){ - if(enabled == 1){ - initAccel(); - }else{ - closeAccel(); - } - } - } - - - - - - - -} - -/** - Simple nativeInit() runnable -*/ -class SDLRunner implements Runnable{ - public void run(){ - //SDLActivity.initAudio(); - - //Runs SDL_main() - SDLActivity.nativeInit(); - - Log.v("SDL","SDL thread terminated"); - } -} - - -/** - SDLSurface. This is what we draw on, so we need to know when it's created - in order to do anything useful. - - Because of this, that's where we set up the SDL thread -*/ -class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, - View.OnKeyListener, View.OnTouchListener, SensorEventListener { - - //This is what SDL runs in. It invokes SDL_main(), eventually - private Thread mSDLThread; - - //EGL private objects - private EGLContext mEGLContext; - private EGLSurface mEGLSurface; - private EGLDisplay mEGLDisplay; - - //Sensors - private static SensorManager mSensorManager; - - //Startup - public SDLSurface(Context context) { - super(context); - getHolder().addCallback(this); - - setFocusable(true); - setFocusableInTouchMode(true); - requestFocus(); - setOnKeyListener(this); - setOnTouchListener(this); - - mSensorManager = (SensorManager)context.getSystemService("sensor"); - } - - //Called when we have a valid drawing surface - public void surfaceCreated(SurfaceHolder holder) { - Log.v("SDL","Surface created"); - - int width = getWidth(); - int height = getHeight(); - - //Set the width and height variables in C before we start SDL so we have - //it available on init - SDLActivity.nativeSetScreenSize(width, height); - - //Now start up the C app thread - mSDLThread = new Thread(new SDLRunner(), "SDLThread"); - mSDLThread.start(); - } - - //Called when we lose the surface - public void surfaceDestroyed(SurfaceHolder holder) { - Log.v("SDL","Surface destroyed"); - - SDLActivity.nativeQuit(); - - //Now wait for the SDL thread to quit - try{ - mSDLThread.wait(); - }catch(Exception e){ - Log.v("SDL","Problem stopping thread: " + e); - } - } - - //Called when the surface is resized - public void surfaceChanged(SurfaceHolder holder, int format, - int width, int height) { - Log.v("SDL","Surface resized"); - - SDLActivity.onNativeResize(width, height, format); - } - - //unused - public void onDraw(Canvas canvas) {} - - - //EGL functions - public boolean initEGL(){ - Log.v("SDL","Starting up"); - - try{ - - EGL10 egl = (EGL10)EGLContext.getEGL(); - - EGLDisplay dpy = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); - - int[] version = new int[2]; - egl.eglInitialize(dpy, version); - - int[] configSpec = { - //EGL10.EGL_DEPTH_SIZE, 16, - EGL10.EGL_NONE - }; - EGLConfig[] configs = new EGLConfig[1]; - int[] num_config = new int[1]; - egl.eglChooseConfig(dpy, configSpec, configs, 1, num_config); - EGLConfig config = configs[0]; - - EGLContext ctx = egl.eglCreateContext(dpy, config, EGL10.EGL_NO_CONTEXT, null); - - EGLSurface surface = egl.eglCreateWindowSurface(dpy, config, this, null); - - egl.eglMakeCurrent(dpy, surface, surface, ctx); - - mEGLContext = ctx; - mEGLDisplay = dpy; - mEGLSurface = surface; - - - }catch(Exception e){ - Log.v("SDL", e + ""); - for(StackTraceElement s : e.getStackTrace()){ - Log.v("SDL", s.toString()); - } - } - Log.v("SDL","Done making!"); - - return true; - } - - //EGL buffer flip - public void flipEGL(){ - try{ - - EGL10 egl = (EGL10)EGLContext.getEGL(); - GL10 gl = (GL10)mEGLContext.getGL(); - - egl.eglWaitNative(EGL10.EGL_NATIVE_RENDERABLE, null); - - //drawing here - - egl.eglWaitGL(); - - egl.eglSwapBuffers(mEGLDisplay, mEGLSurface); - - - }catch(Exception e){ - Log.v("SDL", "flipEGL(): " + e); - - for(StackTraceElement s : e.getStackTrace()){ - Log.v("SDL", s.toString()); - } - } - } - - - - //Key events - public boolean onKey(View v, int keyCode, KeyEvent event){ - - if(event.getAction() == KeyEvent.ACTION_DOWN){ - SDLActivity.onNativeKeyDown(keyCode); - return true; - } - - else if(event.getAction() == KeyEvent.ACTION_UP){ - SDLActivity.onNativeKeyUp(keyCode); - return true; - } - - return false; - } - - //Touch events - public boolean onTouch(View v, MotionEvent event){ - - int action = event.getAction(); - float x = event.getX(); - float y = event.getY(); - float p = event.getPressure(); - - //TODO: Anything else we need to pass? - SDLActivity.onNativeTouch(action, x, y, p); - return true; - } - - //Sensor events - public void enableSensor(int sensortype, boolean enabled){ - //TODO: This uses getDefaultSensor - what if we have >1 accels? - if(enabled){ - mSensorManager.registerListener(this, - mSensorManager.getDefaultSensor(sensortype), - SensorManager.SENSOR_DELAY_GAME, null); - }else{ - mSensorManager.unregisterListener(this, - mSensorManager.getDefaultSensor(sensortype)); - } - } - - public void onAccuracyChanged(Sensor sensor, int accuracy){ - //TODO - } - - public void onSensorChanged(SensorEvent event){ - if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){ - SDLActivity.onNativeAccel( event.values[0], - event.values[1], - event.values[2] ); - } - } - - -} - - diff --git a/include/SDL_config_android.h b/include/SDL_config_android.h index 389eef9f..e13182d8 100755 --- a/include/SDL_config_android.h +++ b/include/SDL_config_android.h @@ -127,7 +127,7 @@ typedef unsigned int size_t; #define SDL_HAPTIC_DUMMY 1 /* Enable various shared object loading systems */ -#define SDL_LOADSO_DUMMY 1 +#define SDL_LOADSO_DLOPEN 1 /* Enable various threading systems */ #define SDL_THREAD_PTHREAD 1 diff --git a/android/project/jni/android-support.cpp b/src/SDL_android.cpp similarity index 74% rename from android/project/jni/android-support.cpp rename to src/SDL_android.cpp index 5f73f2b9..de76a22d 100644 --- a/android/project/jni/android-support.cpp +++ b/src/SDL_android.cpp @@ -1,31 +1,39 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2010 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ +#include "SDL_config.h" + /******************************************************************************* This file links the Java side of Android with libsdl *******************************************************************************/ #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> - -#define DEBUG /******************************************************************************* Globals *******************************************************************************/ -static long _getTime(void){ - struct timeval now; - gettimeofday(&now, NULL); - return (long)(now.tv_sec*1000 + now.tv_usec/1000); -} - +JavaVM* mVM = NULL; JNIEnv* mEnv = NULL; JNIEnv* mAudioThreadEnv = NULL; //See the note below for why this is necessary -JavaVM* mVM = NULL; //Main activity jclass mActivityInstance; @@ -36,7 +44,6 @@ jmethodID midFlipBuffers; jmethodID midEnableFeature; jmethodID midUpdateAudio; -extern "C" int SDL_main(int argc, char *argv[]); extern "C" int Android_OnKeyDown(int keycode); extern "C" int Android_OnKeyUp(int keycode); extern "C" void Android_SetScreenResolution(int width, int height); @@ -57,21 +64,22 @@ float fLastAccelerometer[3]; /******************************************************************************* Functions called by JNI -*******************************************************************************/ - -//Library init -extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved){ +*******************************************************************************/ - JNIEnv* env = NULL; - jint result = -1; +// Library init +extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved) +{ + mVM = vm; - if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) { - return result; - } + return JNI_VERSION_1_4; +} +// Called before SDL_main() to initialize JNI bindings +extern "C" void SDL_Android_Init(JNIEnv* env) +{ mEnv = env; - __android_log_print(ANDROID_LOG_INFO, "SDL", "JNI: OnLoad"); + __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL_Android_Init()"); jclass cls = mEnv->FindClass ("org/libsdl/app/SDLActivity"); mActivityInstance = cls; @@ -81,62 +89,41 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved){ midUpdateAudio = mEnv->GetStaticMethodID(cls,"updateAudio","([B)V"); if(!midCreateGLContext || !midFlipBuffers || !midEnableFeature || - !midUpdateAudio){ + !midUpdateAudio) { __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Bad mids\n"); - }else{ + } else { #ifdef DEBUG __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Good mids\n"); #endif } - - return JNI_VERSION_1_4; -} - -//Start up the SDL app -extern "C" void Java_org_libsdl_app_SDLActivity_nativeInit( JNIEnv* env, - jobject obj ){ - - __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Native Init"); - - mEnv = env; - bRenderingEnabled = true; - - Android_EnableFeature(FEATURE_ACCEL, true); - - char *argv[2]; - argv[0] = strdup("SDL_app"); - argv[1] = NULL; - SDL_main(1, argv); } -//Keydown +// Keydown extern "C" void Java_org_libsdl_app_SDLActivity_onNativeKeyDown(JNIEnv* env, - jobject obj, jint keycode){ - + jobject obj, jint keycode) +{ int r = Android_OnKeyDown(keycode); #ifdef DEBUG __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: native key down %d, %d\n", keycode, r); #endif - } -//Keyup +// Keyup extern "C" void Java_org_libsdl_app_SDLActivity_onNativeKeyUp(JNIEnv* env, - jobject obj, jint keycode){ - + jobject obj, jint keycode) +{ int r = Android_OnKeyUp(keycode); #ifdef DEBUG __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: native key up %d, %d\n", keycode, r); #endif - } -//Touch +// Touch extern "C" void Java_org_libsdl_app_SDLActivity_onNativeTouch(JNIEnv* env, - jobject obj, jint action, jfloat x, jfloat y, jfloat p){ - + jobject obj, jint action, jfloat x, jfloat y, jfloat p) +{ #ifdef DEBUG __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: native touch event %d @ %f/%f, pressure %f\n", @@ -144,42 +131,40 @@ extern "C" void Java_org_libsdl_app_SDLActivity_onNativeTouch(JNIEnv* env, #endif //TODO: Pass this off to the SDL multitouch stuff - } -//Quit +// Quit extern "C" void Java_org_libsdl_app_SDLActivity_nativeQuit( JNIEnv* env, - jobject obj ){ - - //Stop rendering as we're no longer in the foreground - bRenderingEnabled = false; + jobject obj ) +{ + // Stop rendering as we're no longer in the foreground + bRenderingEnabled = false; - //Inject a SDL_QUIT event - int r = SDL_SendQuit(); - - __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Native quit %d", r); + // Inject a SDL_QUIT event + SDL_SendQuit(); } -//Screen size +// Screen size extern "C" void Java_org_libsdl_app_SDLActivity_nativeSetScreenSize( - JNIEnv* env, jobject obj, jint width, jint height){ - + JNIEnv* env, jobject obj, jint width, jint height) +{ __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Set screen size on init: %d/%d\n", width, height); Android_SetScreenResolution(width, height); - } -//Resize +// Resize extern "C" void Java_org_libsdl_app_SDLActivity_onNativeResize( JNIEnv* env, jobject obj, jint width, - jint height, jint format){ + jint height, jint format) +{ Android_OnResize(width, height, format); } extern "C" void Java_org_libsdl_app_SDLActivity_onNativeAccel( JNIEnv* env, jobject obj, - jfloat x, jfloat y, jfloat z){ + jfloat x, jfloat y, jfloat z) +{ fLastAccelerometer[0] = x; fLastAccelerometer[1] = y; fLastAccelerometer[2] = z; @@ -190,38 +175,39 @@ extern "C" void Java_org_libsdl_app_SDLActivity_onNativeAccel( /******************************************************************************* Functions called by SDL into Java *******************************************************************************/ -extern "C" void Android_CreateContext(){ - __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: sdl_create_context()\n"); +extern "C" void Android_CreateContext() +{ + __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: sdl_create_context()\n"); - bRenderingEnabled = true; + bRenderingEnabled = true; mEnv->CallStaticVoidMethod(mActivityInstance, midCreateGLContext ); } -extern "C" void Android_Render(){ - - if(!bRenderingEnabled){ +extern "C" void Android_Render() +{ + if (!bRenderingEnabled) { return; } - //When we get here, we've accumulated a full frame - mEnv->CallStaticVoidMethod(mActivityInstance, midFlipBuffers ); + // When we get here, we've accumulated a full frame + mEnv->CallStaticVoidMethod(mActivityInstance, midFlipBuffers); } -extern "C" void Android_EnableFeature(int featureid, bool enabled){ - +extern "C" void Android_EnableFeature(int featureid, bool enabled) +{ mEnv->CallStaticVoidMethod(mActivityInstance, midEnableFeature, featureid, (int)enabled); } -extern "C" void Android_UpdateAudioBuffer(unsigned char *buf, int len){ - +extern "C" void Android_UpdateAudioBuffer(unsigned char *buf, int len) +{ //Annoyingly we can't just call into Java from any thread. Because the audio //callback is dispatched from the SDL audio thread (that wasn't made from //java, we have to do some magic here to let the JVM know about the thread. //Because everything it touches on the Java side is static anyway, it's //not a big deal, just annoying. - if(!mAudioThreadEnv){ + if(!mAudioThreadEnv) { __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Need to set up audio thread env\n"); mVM->AttachCurrentThread(&mAudioThreadEnv, NULL); diff --git a/src/main/android/SDL_android_main.cpp b/src/main/android/SDL_android_main.cpp new file mode 100644 index 00000000..c675b110 --- /dev/null +++ b/src/main/android/SDL_android_main.cpp @@ -0,0 +1,30 @@ + +/* Include the SDL main definition header */ +#include "SDL_main.h" + +/******************************************************************************* + Functions called by JNI +*******************************************************************************/ +#include <jni.h> + +// Called before SDL_main() to initialize JNI bindings in SDL library +extern "C" void SDL_Android_Init(JNIEnv* env); + +// Library init +extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved) +{ + return JNI_VERSION_1_4; +} + +// Start up the SDL app +extern "C" void Java_org_libsdl_app_SDLActivity_nativeInit( JNIEnv* env, jobject obj ) +{ + /* This interface could expand with ABI negotiation, calbacks, etc. */ + SDL_Android_Init(env); + + /* Run the application code! */ + char *argv[2]; + argv[0] = strdup("SDL_app"); + argv[1] = NULL; + SDL_main(1, argv); +} -- 2.18.1