From db5022f8c4be82445e6a7a183a0acf33d66ed5c4 Mon Sep 17 00:00:00 2001 From: Paul Hunkin 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 000000000..57c344aa8 --- /dev/null +++ b/android/testproject/AndroidManifest.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/android/testproject/build.properties b/android/testproject/build.properties new file mode 100644 index 000000000..edc7f2305 --- /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 000000000..cd16dcbea --- /dev/null +++ b/android/testproject/build.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/testproject/default.properties b/android/testproject/default.properties new file mode 100644 index 000000000..459f2ac68 --- /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 000000000..77dfca416 --- /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 000000000..c91867ee4 --- /dev/null +++ b/android/testproject/jni/app-android.c @@ -0,0 +1,79 @@ +/******************************************************************************* + Headers +*******************************************************************************/ +#include +#include +#include +#include +#include + +/******************************************************************************* + 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 000000000..f501636c7 --- /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 +#include +static HMODULE sGLESDLL = NULL; +#endif // WIN32 + +#ifdef LINUX +#include +#include +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 000000000..b05e0c84f --- /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 +#ifndef ANDROID_NDK +#include +#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/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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 + + + + diff --git a/android/testproject/res/values/strings.xml b/android/testproject/res/values/strings.xml new file mode 100644 index 000000000..060fae8f8 --- /dev/null +++ b/android/testproject/res/values/strings.xml @@ -0,0 +1,4 @@ + + + TestActivity + 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 000000000..5777d42ee --- /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(); +}