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 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 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 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 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