From db5022f8c4be82445e6a7a183a0acf33d66ed5c4 Mon Sep 17 00:00:00 2001
From: Paul Hunkin <paul@bieh.net>
Date: Thu, 17 Jun 2010 22:19:27 +1200
Subject: [PATCH] Added minimal test project

---
 android/testproject/AndroidManifest.xml       |  15 ++
 android/testproject/build.properties          |  17 ++
 android/testproject/build.xml                 |  67 +++++++
 android/testproject/default.properties        |  11 ++
 android/testproject/jni/Android.mk            |  16 ++
 android/testproject/jni/app-android.c         |  79 ++++++++
 android/testproject/jni/importgl.c            | 168 +++++++++++++++++
 android/testproject/jni/importgl.h            | 172 ++++++++++++++++++
 .../testproject/libs/armeabi/libsanangeles.so | Bin 0 -> 14965 bytes
 android/testproject/local.properties          |  10 +
 .../testproject/res/drawable-hdpi/icon.png    | Bin 0 -> 4147 bytes
 .../testproject/res/drawable-ldpi/icon.png    | Bin 0 -> 1723 bytes
 .../testproject/res/drawable-mdpi/icon.png    | Bin 0 -> 2574 bytes
 android/testproject/res/layout/main.xml       |  13 ++
 android/testproject/res/values/strings.xml    |   4 +
 .../src/org/libsdl/android/TestActivity.java  |  76 ++++++++
 16 files changed, 648 insertions(+)
 create mode 100644 android/testproject/AndroidManifest.xml
 create mode 100644 android/testproject/build.properties
 create mode 100644 android/testproject/build.xml
 create mode 100644 android/testproject/default.properties
 create mode 100644 android/testproject/jni/Android.mk
 create mode 100644 android/testproject/jni/app-android.c
 create mode 100644 android/testproject/jni/importgl.c
 create mode 100644 android/testproject/jni/importgl.h
 create mode 100755 android/testproject/libs/armeabi/libsanangeles.so
 create mode 100644 android/testproject/local.properties
 create mode 100644 android/testproject/res/drawable-hdpi/icon.png
 create mode 100644 android/testproject/res/drawable-ldpi/icon.png
 create mode 100644 android/testproject/res/drawable-mdpi/icon.png
 create mode 100644 android/testproject/res/layout/main.xml
 create mode 100644 android/testproject/res/values/strings.xml
 create mode 100644 android/testproject/src/org/libsdl/android/TestActivity.java

diff --git a/android/testproject/AndroidManifest.xml b/android/testproject/AndroidManifest.xml
new file mode 100644
index 00000000..57c344aa
--- /dev/null
+++ b/android/testproject/AndroidManifest.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+      package="org.libsdl.android"
+      android:versionCode="1"
+      android:versionName="1.0">
+    <application android:label="@string/app_name" android:icon="@drawable/icon">
+        <activity android:name="TestActivity"
+                  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/testproject/build.properties b/android/testproject/build.properties
new file mode 100644
index 00000000..edc7f230
--- /dev/null
+++ b/android/testproject/build.properties
@@ -0,0 +1,17 @@
+# 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/testproject/build.xml b/android/testproject/build.xml
new file mode 100644
index 00000000..cd16dcbe
--- /dev/null
+++ b/android/testproject/build.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="Test" 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/testproject/default.properties b/android/testproject/default.properties
new file mode 100644
index 00000000..459f2ac6
--- /dev/null
+++ b/android/testproject/default.properties
@@ -0,0 +1,11 @@
+# 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=Google Inc.:Google APIs:7
diff --git a/android/testproject/jni/Android.mk b/android/testproject/jni/Android.mk
new file mode 100644
index 00000000..77dfca41
--- /dev/null
+++ b/android/testproject/jni/Android.mk
@@ -0,0 +1,16 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := sanangeles
+
+LOCAL_CFLAGS := -DANDROID_NDK \
+                -DDISABLE_IMPORTGL
+
+LOCAL_SRC_FILES := \
+    importgl.c \
+    app-android.c \
+
+LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/android/testproject/jni/app-android.c b/android/testproject/jni/app-android.c
new file mode 100644
index 00000000..c91867ee
--- /dev/null
+++ b/android/testproject/jni/app-android.c
@@ -0,0 +1,79 @@
+/*******************************************************************************
+                               Headers
+*******************************************************************************/
+#include <jni.h>
+#include <sys/time.h>
+#include <time.h>
+#include <android/log.h>
+#include <stdint.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);
+}
+
+/*******************************************************************************
+                      Initialize the graphics state
+*******************************************************************************/
+void Java_org_libsdl_android_TestRenderer_nativeInit( JNIEnv*  env )
+{
+	importGLInit();
+
+	gAppAlive    = 1;
+	sDemoStopped = 0;
+}
+
+/*******************************************************************************
+                                 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();
+}
+
+/*******************************************************************************
+                   Pause (ie: stop as soon as possible)
+*******************************************************************************/
+void Java_org_libsdl_android_TestGLSurfaceView_nativePause( JNIEnv*  env )
+{
+	sDemoStopped = !sDemoStopped;
+	if (sDemoStopped) {
+		//we paused
+	} else {
+		//we resumed
+	}
+}
+
+/*******************************************************************************
+                     Render the next frame
+*******************************************************************************/
+void Java_org_libsdl_android_TestRenderer_nativeRender( JNIEnv*  env )
+{    
+	//TODO: Render here
+}
diff --git a/android/testproject/jni/importgl.c b/android/testproject/jni/importgl.c
new file mode 100644
index 00000000..f501636c
--- /dev/null
+++ b/android/testproject/jni/importgl.c
@@ -0,0 +1,168 @@
+/* San Angeles Observation OpenGL ES version example
+ * Copyright 2004-2005 Jetro Lauha
+ * All rights reserved.
+ * Web: http://iki.fi/jetro/
+ *
+ * This source is free software; you can redistribute it and/or
+ * modify it under the terms of EITHER:
+ *   (1) 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. The text of the GNU Lesser
+ *       General Public License is included with this source in the
+ *       file LICENSE-LGPL.txt.
+ *   (2) The BSD-style license that is included with this source in
+ *       the file LICENSE-BSD.txt.
+ *
+ * This source 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 files
+ * LICENSE-LGPL.txt and LICENSE-BSD.txt for more details.
+ *
+ * $Id: importgl.c,v 1.4 2005/02/08 18:42:55 tonic Exp $
+ * $Revision: 1.4 $
+ */
+
+#undef WIN32
+#undef LINUX
+#ifdef _MSC_VER
+// Desktop or mobile Win32 environment:
+#define WIN32
+#else
+// Linux environment:
+#define LINUX
+#endif
+
+#ifndef DISABLE_IMPORTGL
+
+#if defined(WIN32)
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <tchar.h>
+static HMODULE sGLESDLL = NULL;
+#endif // WIN32
+
+#ifdef LINUX
+#include <stdlib.h>
+#include <dlfcn.h>
+static void *sGLESSO = NULL;
+#endif // LINUX
+
+#endif /* DISABLE_IMPORTGL */
+
+#define IMPORTGL_NO_FNPTR_DEFS
+#define IMPORTGL_API
+#define IMPORTGL_FNPTRINIT = NULL
+#include "importgl.h"
+
+
+/* Imports function pointers to selected function calls in OpenGL ES Common
+ * or Common Lite profile DLL or shared object. The function pointers are
+ * stored as global symbols with equivalent function name but prefixed with
+ * "funcPtr_". Standard gl/egl calls are redirected to the function pointers
+ * with preprocessor macros (see importgl.h).
+ */
+int importGLInit()
+{
+    int result = 1;
+
+#ifndef DISABLE_IMPORTGL
+
+#undef IMPORT_FUNC
+
+#ifdef WIN32
+    sGLESDLL = LoadLibrary(_T("libGLES_CM.dll"));
+    if (sGLESDLL == NULL)
+        sGLESDLL = LoadLibrary(_T("libGLES_CL.dll"));
+    if (sGLESDLL == NULL)
+        return 0;   // Cannot find OpenGL ES Common or Common Lite DLL.
+
+    /* The following fetches address to each egl & gl function call
+     * and stores it to the related function pointer. Casting through
+     * void * results in warnings with VC warning level 4, which
+     * could be fixed by casting to the true type for each fetch.
+     */
+#define IMPORT_FUNC(funcName) do { \
+        void *procAddress = (void *)GetProcAddress(sGLESDLL, _T(#funcName)); \
+        if (procAddress == NULL) result = 0; \
+        *((void **)&FNPTR(funcName)) = procAddress; } while (0)
+#endif // WIN32
+
+#ifdef LINUX
+#ifdef ANDROID_NDK
+    sGLESSO = dlopen("libGLESv1_CM.so", RTLD_NOW);
+#else /* !ANDROID_NDK */
+    sGLESSO = dlopen("libGLES_CM.so", RTLD_NOW);
+    if (sGLESSO == NULL)
+        sGLESSO = dlopen("libGLES_CL.so", RTLD_NOW);
+#endif /* !ANDROID_NDK */
+    if (sGLESSO == NULL)
+        return 0;   // Cannot find OpenGL ES Common or Common Lite SO.
+
+#define IMPORT_FUNC(funcName) do { \
+        void *procAddress = (void *)dlsym(sGLESSO, #funcName); \
+        if (procAddress == NULL) result = 0; \
+        *((void **)&FNPTR(funcName)) = procAddress; } while (0)
+#endif // LINUX
+
+#ifndef ANDROID_NDK
+    IMPORT_FUNC(eglChooseConfig);
+    IMPORT_FUNC(eglCreateContext);
+    IMPORT_FUNC(eglCreateWindowSurface);
+    IMPORT_FUNC(eglDestroyContext);
+    IMPORT_FUNC(eglDestroySurface);
+    IMPORT_FUNC(eglGetConfigAttrib);
+    IMPORT_FUNC(eglGetConfigs);
+    IMPORT_FUNC(eglGetDisplay);
+    IMPORT_FUNC(eglGetError);
+    IMPORT_FUNC(eglInitialize);
+    IMPORT_FUNC(eglMakeCurrent);
+    IMPORT_FUNC(eglSwapBuffers);
+    IMPORT_FUNC(eglTerminate);
+#endif /* !ANDROID_NDK */
+
+    IMPORT_FUNC(glBlendFunc);
+    IMPORT_FUNC(glClear);
+    IMPORT_FUNC(glClearColorx);
+    IMPORT_FUNC(glColor4x);
+    IMPORT_FUNC(glColorPointer);
+    IMPORT_FUNC(glDisable);
+    IMPORT_FUNC(glDisableClientState);
+    IMPORT_FUNC(glDrawArrays);
+    IMPORT_FUNC(glEnable);
+    IMPORT_FUNC(glEnableClientState);
+    IMPORT_FUNC(glFrustumx);
+    IMPORT_FUNC(glGetError);
+    IMPORT_FUNC(glLightxv);
+    IMPORT_FUNC(glLoadIdentity);
+    IMPORT_FUNC(glMaterialx);
+    IMPORT_FUNC(glMaterialxv);
+    IMPORT_FUNC(glMatrixMode);
+    IMPORT_FUNC(glMultMatrixx);
+    IMPORT_FUNC(glNormalPointer);
+    IMPORT_FUNC(glPopMatrix);
+    IMPORT_FUNC(glPushMatrix);
+    IMPORT_FUNC(glRotatex);
+    IMPORT_FUNC(glScalex);
+    IMPORT_FUNC(glShadeModel);
+    IMPORT_FUNC(glTranslatex);
+    IMPORT_FUNC(glVertexPointer);
+    IMPORT_FUNC(glViewport);
+
+#endif /* DISABLE_IMPORTGL */
+
+    return result;
+}
+
+
+void importGLDeinit()
+{
+#ifndef DISABLE_IMPORTGL
+#ifdef WIN32
+    FreeLibrary(sGLESDLL);
+#endif
+
+#ifdef LINUX
+    dlclose(sGLESSO);
+#endif
+#endif /* DISABLE_IMPORTGL */
+}
diff --git a/android/testproject/jni/importgl.h b/android/testproject/jni/importgl.h
new file mode 100644
index 00000000..b05e0c84
--- /dev/null
+++ b/android/testproject/jni/importgl.h
@@ -0,0 +1,172 @@
+/* San Angeles Observation OpenGL ES version example
+ * Copyright 2004-2005 Jetro Lauha
+ * All rights reserved.
+ * Web: http://iki.fi/jetro/
+ *
+ * This source is free software; you can redistribute it and/or
+ * modify it under the terms of EITHER:
+ *   (1) 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. The text of the GNU Lesser
+ *       General Public License is included with this source in the
+ *       file LICENSE-LGPL.txt.
+ *   (2) The BSD-style license that is included with this source in
+ *       the file LICENSE-BSD.txt.
+ *
+ * This source 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 files
+ * LICENSE-LGPL.txt and LICENSE-BSD.txt for more details.
+ *
+ * $Id: importgl.h,v 1.4 2005/02/24 20:29:33 tonic Exp $
+ * $Revision: 1.4 $
+ */
+
+#ifndef IMPORTGL_H_INCLUDED
+#define IMPORTGL_H_INCLUDED
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#include <GLES/gl.h>
+#ifndef ANDROID_NDK
+#include <GLES/egl.h>
+#endif /* !ANDROID_NDK */
+
+/* Use DISABLE_IMPORTGL if you want to link the OpenGL ES at
+ * compile/link time and not import it dynamically runtime.
+ */
+#ifndef DISABLE_IMPORTGL
+
+
+/* Dynamically fetches pointers to the egl & gl functions.
+ * Should be called once on application initialization.
+ * Returns non-zero on success and 0 on failure.
+ */
+extern int importGLInit();
+
+/* Frees the handle to egl & gl functions library.
+ */
+extern void importGLDeinit();
+
+
+#ifndef IMPORTGL_API
+#define IMPORTGL_API extern
+#endif
+#ifndef IMPORTGL_FNPTRINIT
+#define IMPORTGL_FNPTRINIT
+#endif
+
+#define FNDEF(retType, funcName, args) IMPORTGL_API retType (*funcPtr_##funcName) args IMPORTGL_FNPTRINIT
+
+#ifndef ANDROID_NDK
+FNDEF(EGLBoolean, eglChooseConfig, (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config));
+FNDEF(EGLContext, eglCreateContext, (EGLDisplay dpy, EGLConfig config, EGLContext share_list, const EGLint *attrib_list));
+FNDEF(EGLSurface, eglCreateWindowSurface, (EGLDisplay dpy, EGLConfig config, NativeWindowType window, const EGLint *attrib_list));
+FNDEF(EGLBoolean, eglDestroyContext, (EGLDisplay dpy, EGLContext ctx));
+FNDEF(EGLBoolean, eglDestroySurface, (EGLDisplay dpy, EGLSurface surface));
+FNDEF(EGLBoolean, eglGetConfigAttrib, (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value));
+FNDEF(EGLBoolean, eglGetConfigs, (EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config));
+FNDEF(EGLDisplay, eglGetDisplay, (NativeDisplayType display));
+FNDEF(EGLint, eglGetError, (void));
+FNDEF(EGLBoolean, eglInitialize, (EGLDisplay dpy, EGLint *major, EGLint *minor));
+FNDEF(EGLBoolean, eglMakeCurrent, (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx));
+FNDEF(EGLBoolean, eglSwapBuffers, (EGLDisplay dpy, EGLSurface draw));
+FNDEF(EGLBoolean, eglTerminate, (EGLDisplay dpy));
+#endif /* !ANDROID_NDK */
+
+FNDEF(void, glBlendFunc, (GLenum sfactor, GLenum dfactor));
+FNDEF(void, glClear, (GLbitfield mask));
+FNDEF(void, glClearColorx, (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha));
+FNDEF(void, glColor4x, (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha));
+FNDEF(void, glColorPointer, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer));
+FNDEF(void, glDisable, (GLenum cap));
+FNDEF(void, glDisableClientState, (GLenum array));
+FNDEF(void, glDrawArrays, (GLenum mode, GLint first, GLsizei count));
+FNDEF(void, glEnable, (GLenum cap));
+FNDEF(void, glEnableClientState, (GLenum array));
+FNDEF(void, glFrustumx, (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar));
+FNDEF(GLenum, glGetError, (void));
+FNDEF(void, glLightxv, (GLenum light, GLenum pname, const GLfixed *params));
+FNDEF(void, glLoadIdentity, (void));
+FNDEF(void, glMaterialx, (GLenum face, GLenum pname, GLfixed param));
+FNDEF(void, glMaterialxv, (GLenum face, GLenum pname, const GLfixed *params));
+FNDEF(void, glMatrixMode, (GLenum mode));
+FNDEF(void, glMultMatrixx, (const GLfixed *m));
+FNDEF(void, glNormalPointer, (GLenum type, GLsizei stride, const GLvoid *pointer));
+FNDEF(void, glPopMatrix, (void));
+FNDEF(void, glPushMatrix, (void));
+FNDEF(void, glRotatex, (GLfixed angle, GLfixed x, GLfixed y, GLfixed z));
+FNDEF(void, glScalex, (GLfixed x, GLfixed y, GLfixed z));
+FNDEF(void, glShadeModel, (GLenum mode));
+FNDEF(void, glTranslatex, (GLfixed x, GLfixed y, GLfixed z));
+FNDEF(void, glVertexPointer, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer));
+FNDEF(void, glViewport, (GLint x, GLint y, GLsizei width, GLsizei height));
+
+
+#undef FN
+#define FNPTR(name) funcPtr_##name
+
+#ifndef IMPORTGL_NO_FNPTR_DEFS
+
+// Redirect egl* and gl* function calls to funcPtr_egl* and funcPtr_gl*.
+
+#ifndef ANDROID_NDK
+#define eglChooseConfig         FNPTR(eglChooseConfig)
+#define eglCreateContext        FNPTR(eglCreateContext)
+#define eglCreateWindowSurface  FNPTR(eglCreateWindowSurface)
+#define eglDestroyContext       FNPTR(eglDestroyContext)
+#define eglDestroySurface       FNPTR(eglDestroySurface)
+#define eglGetConfigAttrib      FNPTR(eglGetConfigAttrib)
+#define eglGetConfigs           FNPTR(eglGetConfigs)
+#define eglGetDisplay           FNPTR(eglGetDisplay)
+#define eglGetError             FNPTR(eglGetError)
+#define eglInitialize           FNPTR(eglInitialize)
+#define eglMakeCurrent          FNPTR(eglMakeCurrent)
+#define eglSwapBuffers          FNPTR(eglSwapBuffers)
+#define eglTerminate            FNPTR(eglTerminate)
+#endif /* !ANDROID_NDK */
+
+#define glBlendFunc             FNPTR(glBlendFunc)
+#define glClear                 FNPTR(glClear)
+#define glClearColorx           FNPTR(glClearColorx)
+#define glColor4x               FNPTR(glColor4x)
+#define glColorPointer          FNPTR(glColorPointer)
+#define glDisable               FNPTR(glDisable)
+#define glDisableClientState    FNPTR(glDisableClientState)
+#define glDrawArrays            FNPTR(glDrawArrays)
+#define glEnable                FNPTR(glEnable)
+#define glEnableClientState     FNPTR(glEnableClientState)
+#define glFrustumx              FNPTR(glFrustumx)
+#define glGetError              FNPTR(glGetError)
+#define glLightxv               FNPTR(glLightxv)
+#define glLoadIdentity          FNPTR(glLoadIdentity)
+#define glMaterialx             FNPTR(glMaterialx)
+#define glMaterialxv            FNPTR(glMaterialxv)
+#define glMatrixMode            FNPTR(glMatrixMode)
+#define glMultMatrixx           FNPTR(glMultMatrixx)
+#define glNormalPointer         FNPTR(glNormalPointer)
+#define glPopMatrix             FNPTR(glPopMatrix)
+#define glPushMatrix            FNPTR(glPushMatrix)
+#define glRotatex               FNPTR(glRotatex)
+#define glScalex                FNPTR(glScalex)
+#define glShadeModel            FNPTR(glShadeModel)
+#define glTranslatex            FNPTR(glTranslatex)
+#define glVertexPointer         FNPTR(glVertexPointer)
+#define glViewport              FNPTR(glViewport)
+
+#endif // !IMPORTGL_NO_FNPTR_DEFS
+
+
+#endif // !DISABLE_IMPORTGL
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif // !IMPORTGL_H_INCLUDED
diff --git a/android/testproject/libs/armeabi/libsanangeles.so b/android/testproject/libs/armeabi/libsanangeles.so
new file mode 100755
index 0000000000000000000000000000000000000000..19f068d921b537084d27ab04b0e44ff46a39ec04
GIT binary patch
literal 14965
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

literal 0
HcmV?d00001

diff --git a/android/testproject/local.properties b/android/testproject/local.properties
new file mode 100644
index 00000000..27accedc
--- /dev/null
+++ b/android/testproject/local.properties
@@ -0,0 +1,10 @@
+# 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/testproject/res/drawable-hdpi/icon.png b/android/testproject/res/drawable-hdpi/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..8074c4c571b8cd19e27f4ee5545df367420686d7
GIT binary patch
literal 4147
zcmV-35X|q1P)<h;3K|Lk000e1NJLTq002k;002k`1^@s6RqeA!00004b3#c}2nYxW
zd<bNS00009a7bBm000W`000W`0Ya=am;e9(9CSrkbW?9;ba!ELWdK2BZ(?O2Mrm?o
zcW-iQb09-gGzPNMpa1|5tw}^dRCt{2oOy6v)qTf5=iKFO(zBjyS+Xo+%Qj{)!7Q$W
z6KBFe9H5z!Cet*NNr0A2LK&8HhBBEZoyic|G);$p5}K_o1!mG|N`@p9l1vB;J7GzU
z0UH||Z?dh;mfn-zdhc2K$9>OwvMs$Q8_8nISM!^>PxsujeDCl4&hPxrxkp%Qc^^|l
zp6LqAcf3zf1H4aA1Gv-O6ha)ktct9Y+VA@N^9i;p0H%6v>ZJZYQ`zEa396z-gi{r_
zDz)D=vgRv62GCVeRjK{15j7<m5mZl(2gHEX4d3YbCqHS|8EZwgD)Wt;2qJ2{6v75Y
zvGsww4t^CV0F}B_(~=~n8|H-&l88hPhy!ic-_?C@ysdn7po;H83+4{Ko1~nL|K`DO
z9KIFE0%ag1(kL?(4~+<_k&^&YU;FXK@3ppjpEO#}zYf(17Np}aJ`(=&TVH<hHX=<b
z5s{?r6ht)YVl@ql0gJj;%S|0!N#3izr4TSYFun;`M5H+(6ZYt&XojGg?MdgxMnbQ(
zfHCh)hNKka#wsC@21bc&QApGuPFaI$20D(BQsC5V9{>V@v6|2nafFX6W7z2j1_T0a
zLyT3pGTubf1lB5)32>bl0*BflrA!$|_(<V4RW3$KB75pFc@&<Kfa&v`Fw!w=tK8Iy
zHVRiH=xw{4ws<c}SHKc=Lkreetg(}xDTiaMY5!xcI{O}^bumUCOUp@~3ss5EmUUcv
z?hlDO8H^6mIwbC7xc1y1)0w)EKovQ@ZYL8PjkvLDn_L>WD2)iJIfV}37=<tz>ZKAC
zSe3boYtQ=;o0i>)RtBvsI#iT{0!oF1VFeW`jDjF2Q4aE?{pGCAd>o8Kg#neIh*AMY
zLl{;F!vLiem7s*x0<9FKAd6LoPz3~G32P+F+cuGOJ5gcC@pU_?C<K#zxM?|P#!;*h
z<yaeeoHc_VQSY*5(bXKxzCv5Fm-fVJhKt+z;Idmt`HNZ7dLb2^=kZ;C$5{Cwn^xRG
zZ~I3Hb%|X0Ab~D%ara-4jxS|#%LP2Y?;eW55jL;+ds_T1et+Qmyx#v41QKfv%7pZ!
zH}KI_U!xctA=G7zRgr=;7(HxFvnR-Ds^N`rOa*J?)FjYl+7i8Vq}KApuDd8yhFQ7r
z3QEBkovrIw+xcf~8~8bAWiDey=A&d1tN5d3Ut-sh$0-EENIaAY=t!N%MN2<V-{|kj
zmHW7A&3CA%0<RDJl#i{xoA%_{#M}($cm63cw~Y_4xPwra**EeWu8d=hIiYUT$?@$v
z9fImJ5!Qk=6B4Ql%hDet?zeE^lFyO!+gaYW2}i`RR&#i43orNm8^uZvtiyuXa<K6H
z-tY3(;G+m3!AdNGf!v!svHLE9uuNC_0^aC<m>2fmix7g2<OKw(NJSO!Wh<G)O12OD
zk{9;hOR+MF#G6#FX=OtB>)SUaQO$NS07~H)#fn!Q<}KQWtX}wW`g2>cMld+`7Rxgq
zChaey66SG560JhO66zA!;sK1cWa2AG$9k~VQY??6bOmJsw9@3uL*z;WWa7(Nm{^TA
zilc?y#N9O3LcTo2c)6d}SQl-v-pE4^#wb=s(RxaE28f3FQW(yp$ulG9{KcQ7r>7mQ
zE!HYxUYex~*7IinL+l*>HR*UaD;HkQhkL(5I@UwN%Wz504M^d!ylo>ANvKPF_TvA<
zkugG5;F6x}$s~J8cnev->_(Ic7%lGQgUi3n#XVo36lUpcS<B*<^O3@1)uNA43bS0?
za~<a`{v?j@Ske9wVqO|oCZ?^w;|LChBf!5j-{=N?H4Q8SE&@KYZ+HK&Jq|$-TC1x+
zjI}`!SgWno%32kg6Ve1hV0CD17-|~^%35o!4y{$8K9;8rtqlWhby$7YT5EMR?_>9s
z)ympRr7}@|6WF)Ae;D{owN1;aZS<z%U`85L3`Wtq;{;U>R50al9h~?-WhbtKK%bDd
zhML131oi1Bu1&Qb$Cp199LJ#;j5d|FhW8_i4KO1OI>}J^p2DfreMSVGY9aFlr&90t
zyI2FvxQiKMFviSQeP$Ixh#70qj5O%I+O_I2t2XHWqmh2!1~tHpN3k<ugQ5k@C@Ok7
z+FQ2}+B9a|#m)q5Ej;-ypgId^I<pxY>A4n=1iHj?`@c<~3q<khQ_D+AiSPS(o;PhA
z`n^Sv1#1+erM+mQs!_q26XUurrBaD_Jl?i>^X6_Q$AqTDjBU`|!y<&lkqL|m5tG(b
z8a!z&j^m(|;?SW(l*?tZ*{m2H9d&3jqBtXh>O-5e4Qp-W*a5=2NL&Oi62BUM)>zE3
zbSHb>aU3d@3cGggA`C-PsT9^)oy}%dHCaO~nwOrm5E54=aD<PxWdc(q&_xc9ze;;z
zHLgsOaNCGEX{@j)Q^Ht%Tpp3F>g(&HR4S23Oa#-a^=}w%g?ZP-1iq8PSjE8jYaGZu
z$I<dGMoPOWg+~}HypAJW1P(3!5;{{KV0qg|Sem{J-)X5D@d@oNm&=TgkK?+NnkmGD
z-_Q{A#FMr-B8Dqt^yOY;>)?YN8he?F9>)<bj*Q_57qEn;3|Nj9cQTmY%C_N$=t`~Q
z;w4{XMcd^l6D<P?Ay7&Y1OdM9A8)vuc8KPXAd4&GNZ}FcLfta4#gi!lo#*+!e`fp8
z&(OAv=d=)a+Um*{SaelE1QL&!lK>2d$G6a*zm0XB*Rf&gZAjq(8l@CUDSY1tB#!i>
zW$VfG%#SYSiZ}<yUM62T%y}K3#sZ-(5_4L}RSxpRzOQpA_YyHTjW5$2?;2XGa7B!d
ztoRyIcszIDAF1eZgm9|eQuBwy|4Kd>;)>pHA`qlfDTEYQEwN6>NNEp+uxuqx({Fgr
zjI@!4xRc?vk^9+~eU|mzH__dCDI=xb{Cd}4bELS9xRaS!*FXMwtMR-RR%SLMh0Cjl
zencr8#Su<4(%}$yGVB<Bgt*hjhnC%m<GA#mwVG#MdW;e0Y1~wZEwtgvc)kC3T3hfY
zSMoH5`B0b0#8+|6>U-HX{18v=yPH*+%^Vtknc>2A;%-~DrYFx^3XfuVgvZ{#1tA==
zm3>IzAM2{3Iv_d1XG{P6^tN3|PkJMnjs&CWN7%7_CmjoVakUhsa&dMv==2~^ri?&x
zVdv*rnfVyM+I1^Kg*S=23mR@+0T9BWFZUu~@toA8d)fw6be=`Yb6DSX6D?jB%2YT~
z*aHjtIOozfMhA!Jd*?u5_n!SnX>vX`=Ti-1HA<HWRGx~;;frK-Ys%y;GE<2slXx;!
zx1GgM4s$rf_|Ve7;o7tR9cwMW*zuR_9{CMPZ!v@(j)WyE5}b8zA|%>4RiE>eI3vTn
zz+>Ccf0HX6Ans-ebOB>RJST-Cyr#4XAk+mAlJgdQnoE{^iIN)OcYFSpgJUmXtl@tT
z-^ZuUeSj5hSFrQwqX>~EtZ*{>Gi8Bu9_|o06oNtaXP?E936!a@DsvS*tsB@fa6kEA
z5GkjwmH?EgpiG&itsB_Tb1NxtF<S=iW9N}aFjnEobhIC__!e&t|CIIJH?ueUG}@}#
z*5IbJ2TmcPSR2JoRU8pxF#iT)<-^sjbdq(QH?VQp^>nvxh_s@9KYX1Sttf?AlI~)z
zT=6Y7ulx=}<8Scr_UqU-_z)5gPo%050PsbM*ZLno;_-ow&k?FZJtYmb2hPA$LkP)8
z=^d0Q6PImh6Y|QT?{grxj)S=uBKvY2EQUbm@ns9^yKiP~$DcD)c$5Em`zDSScH%iH
zVov&m=cMo`1tYwA=!a}vb_ef_{)Q2?FUqn>BR$6phXQRv^1%=YfyE-F$AR4Q?9D!f
zCzB^^#td~4u&l~l#rp2QLfe3+_ub9@+|x+m;=2(sQ`s%gO|j$XBb>A7Q(Uy<Ms~mR
z)sr@Bsv6HJK@x#68l_8!W4+tria4%_*Y>dipiMw%igcweV#Cr~SP);q>w`bxts_4}
znKHg?X==JDkQl3Y>Ckt%`s{n?Nq-1<xam62X*|eake2F>Fw5~%Mq$CAsi-`yu_bKm
zxs#QdE7&vgJD%M84f4SNzSDv)S|V?|$!d5a#lhT5>>YWE4NGqa9-fbmV$=<!@JM<c
zC&X_omO$rmWt??g*K=X#7Z@$=;a9tEXDI(Vu9G}wXJ-C-A`g4(;Dem+-U&z%S^l~N
zQ((^hAY(O|#LDVE#%LB51-uk1+Ae2(_f1IQ@xp<7*qeP4fxvebRLei*VsS*AT)B@e
zWA_nla&2xtIp+k0rc6h2Eh(>)@k&32kdEYetna>=j@0>V8+wRsL;po!3ivVwh<9tn
z2S<1u9DAAQ>x1Sn=fk`)At|quvleV($B|#Kap_lB-F^*yV=wZ{9baUu(uXfokr95^
zA*!*W=5a>$2Ps`<ZO3O>-F^+qRQT<luhKvM2V5DC;>^{*cN>vipT*4!r#p%{(#I7s
z0NN94*q?ib$KJjfDI_sjHNdmEVp5wB&j54O#VoFqBwy)gfA$%)4d_X4q${<K?$%4`
zAKx-J)i?#riIMhXoFj#uJh}JljFtNkLb7$>L9Xom2R3xy&ZBSNgt4a1d7K^CDWa9r
zVb-_52m}Vp)`9;ZSKd#|U4ZYj5}Gp49{4utST|=c`~(#>KHF6}CCov<Oc3fKBc;8#
zGIi`Nx+1|?<uF?Y9^~S#8%cQ`XcHd0KbtaZ1f3cTu8gxFwmkaSt`43|v19n>1iHYw
zt{bWo)A@yF2$~c(nR$rSAaFQ$(Wh{vkG1AlutDMw=mM`C`T=X&|Ad9fb5Od}ROt1z
z<iuFelzP>OpczHqrb4Jo^rSCiW#&o(m7jFamnrsTpQb;*h4o8r#$aZ}2RaT-x2u^^
z%u@YyIv$U^u~@9(XGbSwU@fk6SikH>j+D1jQrYTKGJpW%vUT{!d}7THI5&Sa?~MKy
zS0-mvMl+BOcroEJ@hN!2H_?coTEJ5Q<;Nd?yx;eIj4{$$E2?YUO|NtNPJ-PdDf;s}
zab;}Mz0kbOI}5*w@3gROcnl#5)wQnEhDBfn!Xhy`u>C}*E~vWpO^HS)FC>8^umI=+
z&H;LW6w#;EF`}vQd_9Muru`KnQVPI9U?(sD<bWa&SZmeEGH6DFY6WD0w}C;Rh4&^w
zc_LD>)&Dg-0j3#(!fNKVZ_GoYH{la~d*1Yh$TI-TL>mI4vpNb@sU2=IZ8vL%AXUx0
zz{K0|nK(yizLHaeW#ZhRfQXoK^}1$<rbM${EMT&_)(%*j&)QQ%O^fOeSPGdq*yOYb
xs*zGFL~-IVT`+%1s&@qImmziC^|Zdw{{iC%_e>=$#1{Yn002ovPDHLkV1n#w+^+xt

literal 0
HcmV?d00001

diff --git a/android/testproject/res/drawable-ldpi/icon.png b/android/testproject/res/drawable-ldpi/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..1095584ec21f71cd0afc9e0993aa2209671b590c
GIT binary patch
literal 1723
zcmV;s21NOZP)<h;3K|Lk000e1NJLTq001Na001Ni1^@s6;Q*MJ000JpNkl<ZSPAV|
zTWnNS6kYeubY6Whoj!oJloqJGA0nb5fDz@Ri3x^3On~Tz5)-4wS4_m1D8}&Nhfxy{
z69ayjV2tmmi3my*6%bHLDd3b!TbgO<OkeZ557)lsPCB=DDm0)!?#Z5e&z^J7UT5un
z&e?N;|7BtZ6qldHRz&qty;Kj?tsl+TEe4;^sTwtN^<Hc_aXON=04dx0QuR(xarQnl
z*Y$?on0m_h`QGh4&vC>ARe<Hh2}sx|ed^8SkIr5c-eKY<z@Y<$pYtcLyzu(tC*Edr
zfGVt6A|V+oDjOw3!~L}g5sYa<;YBw!cvP<gp2D9sD2mKstmNBG(}1d|`Ohi}28QFc
zd@4j8rse<%fUzQs`BO<V2!pqV3cn|URWqK1t{KpE6MB{**A-+kBUsn?3bR3hq3JMb
zGc*%gR>P91Tc8>~sHP8V>Ys(CF=aT`Sk=;|pS}XrJPb~T1dys{sdO&0YpQBSz*~us
zcN*3-J_EnE1cxrXiq*F~jZje~rkAe3vf3>;eR)3?Ox=jK*jEU7Do|T`2NqP{56w(*
zBAf)rvPB_7rsfeKd0^!CaR%BHUC$tsP9m8a!i@4&TxxzagzsYHJvblx4rRUu#0Jlz
zclZJwdC}7S3BvwaIMTiwb!98zRf|zoya>NudJkDGgEYs=q*HmC)>GExofw=92}s;l
z_YgKLUT5`<1RBwq{f)K<EkI>~I%M=gRE6d<FHDq&W)h|sStE^=^^YK)Y-gCukktCI
zyk;}6aco?&J1^Hr5X_bX_y7#KLtFtxLbEV4yat9bO7raUdvlKkyy4uvOtCUJFV~jL
z4F_gf?I6P`67*JZthLs?{Usrbgxc+9-qjV5^bjy6SJ}TU{|O*fbxYmRsk;KwbuMGF
zV~6Z!up~a*#1)Wq6hM;=nYFAZ2=_!2bp<33Og4weD-y{LCU=7y0hUbw7ZO)M(s|N=
zOdXwxqui@za+L9lLcsL(^&t=lRI|f4WUhcDzSj?k+on>)b5BP`8{u9x0-wsG%H)w^
zRU7n9FwtlfsZ<KFSWNbmYXiiN*Ok-)q-Xedoa)(!*hmY~dIHC~-a*J$h1uondA4mP
zSU)GJA(2QR7z~OFS!x0(50ooIHamrqTGLZ7%q)D~GHbL$9Xrt0`x#VKN-6Q6pnl3)
zbR>SjiSB(k8~Y5+O>dyoSI477Ly?|FR?m))C!ci%BtY!2Sst8Uri#|SFX&)8{_Ou2
z9r5p3Vz9_GY#%D>%huqp_>U}K45YGy__TE!HZA@bMxX~@{;><au~O%#R=eO1RfrvV
zN@}1b)ej(%>cGYRgH~Ih*vd7EgV7h6Pg$#$lH+5=^lj{W80p{{l+;{7_t5cv3xVUy
zl_BY4ht1JH*EEeRS{VwTC(QFIVu8zF&P8O$gJsMgsS<v<^cG8zH12ME8E3p7ArSJ)
z&M1j((`t=fkRbsyk@k;7F_7#+Brq3Ek@Z%>O35SVvBrX`Vah$Yz2-5T>-`4DJNH;N
zlSSY8-mfty+|1~*;BtTwL<Ip!$O-{6nJWXCZfj~?gGcf6rCkhL5i}!%NU#a3>z_w5
z+lRv)J28~G%ouyvca(@|{2->WsPii&79&nju7ITE6hMX4AQc{|KqZN#)aAvemg3IZ
zCr}Y+!r}JU&^>U1C2WyZC<=47itSYQ`?$5{VH?mtFMFFExfYTsfqK%*WzH@Onc#i`
zI@a|rm-WbKk{5my{mF}H>Duc$bit&yLAgFfqo2vVbm~?FeG#0F?dSP*kxSo0Ff!o@
z(C}B;r&6pa-NY4;y~5lX8g&*MYQ>yLGd^tDWC4(sGy$Ow-*!eh%xt;>ve|J1q$*w<
zh;B#cz!6l2=5bkX#nJ9PJQ`ew8t>7z$bxqf*QB=l2_UB$hK|1EIfloN-jQ=qcwChF
zYAkkyp=;FwcnUB3v0=*tMYMA(Hdy<PN`g-^IhR&%fzFN6N*#&lHK?Lk=ZxLc=3rdN
zq(e3yk0;yO+EN7N%Am(wh<K-;2jmbL8HO+Z6SBz}=uJg)0~flX15@%oImi=w^eu?^
z%t_uJK&!llk^e99-)25FLY2R~H%i2Lni{9JP+O^e)Z7~oXC_K$<<GxNRbG`8Q=NTi
znzRTYIm5)q73$E{HZP;%WJucbIzw0y6~<h{M*Cz$0Li2UlrSYKFR#RI$=`tPT2(|y
Rn%e*X002ovPDHLkV1g`*Fem^3

literal 0
HcmV?d00001

diff --git a/android/testproject/res/drawable-mdpi/icon.png b/android/testproject/res/drawable-mdpi/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..a07c69fa5a0f4da5d5efe96eea12a543154dbab6
GIT binary patch
literal 2574
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

literal 0
HcmV?d00001

diff --git a/android/testproject/res/layout/main.xml b/android/testproject/res/layout/main.xml
new file mode 100644
index 00000000..35531742
--- /dev/null
+++ b/android/testproject/res/layout/main.xml
@@ -0,0 +1,13 @@
+<?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, TestActivity"
+    />
+</LinearLayout>
+
diff --git a/android/testproject/res/values/strings.xml b/android/testproject/res/values/strings.xml
new file mode 100644
index 00000000..060fae8f
--- /dev/null
+++ b/android/testproject/res/values/strings.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">TestActivity</string>
+</resources>
diff --git a/android/testproject/src/org/libsdl/android/TestActivity.java b/android/testproject/src/org/libsdl/android/TestActivity.java
new file mode 100644
index 00000000..5777d42e
--- /dev/null
+++ b/android/testproject/src/org/libsdl/android/TestActivity.java
@@ -0,0 +1,76 @@
+package org.libsdl.android;
+
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+
+import android.app.Activity;
+import android.content.Context;
+import android.opengl.GLSurfaceView;
+import android.os.Bundle;
+import android.view.MotionEvent;
+
+public class TestActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mGLView = new TestGLSurfaceView(this);
+        setContentView(mGLView);
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        mGLView.onPause();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mGLView.onResume();
+    }
+
+    private GLSurfaceView mGLView;
+
+    static {
+        System.loadLibrary("sanangeles");
+    }
+}
+
+class TestGLSurfaceView extends GLSurfaceView {
+    public TestGLSurfaceView(Context context) {
+        super(context);
+        mRenderer = new TestRenderer();
+        setRenderer(mRenderer);
+    }
+
+    public boolean onTouchEvent(final MotionEvent event) {
+        if (event.getAction() == MotionEvent.ACTION_DOWN) {
+            nativePause();
+        }
+        return true;
+    }
+
+    TestRenderer mRenderer;
+
+    private static native void nativePause();
+}
+
+class TestRenderer implements GLSurfaceView.Renderer {
+    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
+        nativeInit();
+    }
+
+    public void onSurfaceChanged(GL10 gl, int w, int h) {
+        //gl.glViewport(0, 0, w, h);
+        nativeResize(w, h);
+    }
+
+    public void onDrawFrame(GL10 gl) {
+        nativeRender();
+    }
+
+    private static native void nativeInit();
+    private static native void nativeResize(int w, int h);
+    private static native void nativeRender();
+    private static native void nativeDone();
+}
-- 
2.18.1