2011-03-14 12 views
8

Acabo de empezar a aprender OpenGL ES en android (usando this book) y encontré un problema de adopción del código source del capítulo 5 a los métodos existentes de uso de jni en android (en realidad, también preocupaciones simplemente ejecutando una aplicación GL nativa). Estoy intentando compilar el código nativo para obtener .so lib y usarlo más en el archivo .apk. Pero la compilación no es posible si ciertas libs no están presentes (que son GLES/gl.h, EGL/egl.h, GLES/gl.h, GLES/glext.h).Instalar OpenGL ES y compilar el código para android

Entonces, la pregunta es ¿cómo instalo esas libs (instalación de AFAIU, OpenGL ES y EGL) y compilo el código nativo más trivial? (los tutoriales son muy admirados).

Gracias de antemano.

EDITAR: He intentado el ejemplo glbuffer como se sugirió (archivo .mk ligeramente cambiado), pero todavía no tuvo éxito. Compilador me da el mismo resultado que antes:

ndk-build

Compile thumb: egl <= cube.c

/path/jni/cube.c:5:21: error: GLES/gl.h: No such file or directory // same message for glbuffer when gl.h is being included

Este es el código cube.c:

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

#include <GLES/gl.h> 

#define FIXED_ONE 0x10000 
#define one 1.0f 

typedef unsigned char byte; 

extern void jni_printf(char *format, ...); 

// Cube static 
GLfloat vertices[24] = {  -one, -one, -one,  one, -one, 
-one,  one, one, -one,  -one, one, -one,  -one, -one, one,  one, -one, one,  one, one, one,  -one, one, one, }; 

static GLfloat colors[] = {   0, 0, 0, one,  one, 0, 0, one,  one, one, 0, one,  0, one, 0> , one,  0, 0, one, one,  one, 0, one, one,   one, one, one, one,  0, one, one, one, }; 

static byte indices[] = {  0, 4, 5, 0, 5, 1,   1, 5, 6, 1, 6, 2,  2, 6, 7, 2, 7, 3,  3, 7, 4, 3, 4, 0,  4, 7, 6, 4, 6, 5,  3, 0, 1, 3, 1, 2 }; 


void Cube_draw() { 
glFrontFace(GL_CW); 
glVertexPointer(3, GL_FLOAT, 0, vertices); 
glColorPointer(4, GL_FLOAT, 0 , colors); 
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, indices); } 

Es muy trivial y no funciona, sin embargo.

Android.mk:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_LDLIBS := -lGLESv1_CM.so 
LOCAL_MODULE := egl 
LOCAL_SRC_FILES := cube.c cuberenderer.c 

include $(BUILD_SHARED_LIBRARY) 
+0

Hojeé ese libro y me desalentó con el código nativo. Cuando llegué a intentarlo, simplemente miré algunos ejemplos de la fuente, tomé un archivo .mk de muestra y cambié el nombre de algunas cosas y ya estaba funcionando. ¿Es ese libro ridículamente complicado sin razón, o tenía que hacer las cosas de esa manera antes de que saliera un lanzamiento más reciente de NDK? –

+0

@Poldie, no es complejo, solo requiere una doble revisión. Además, está obsoleto un poco, por lo que dice muchas cosas redundantes para un aprendizaje rápido, aunque es útil saberlo. Los ejemplos funcionan bien con los cambios, pero cuando llegué a GL no puedo compilarlo. La parte de Java funciona bien. –

Respuesta

17

Esas bibliotecas son proporcionados por sí Android. Sin embargo, configurar su proyecto para encontrarlos y compilar su código JNI (nativo) correctamente puede ser desalentador.

Recomiendo usar glbuffer como proyecto inicial, ya que le proporcionará un GLSurfaceView para dibujar y configurar las bibliotecas adecuadas de Android.

Los detalles de vincular a las bibliotecas de Android están contenidos en jni/Android.mk dentro de ese proyecto si desea darle una oportunidad desde cero.

Editar - al parecer glbuffer falta jni/Application.mk. Créelo y póngalo adentro:

APP_ABI := armeabi armeabi-v7a 
APP_PLATFORM := android-8 

Luego el ndk sabrá mirar dentro de la plataforma android-8 para sus includes. Puede cambiar esto a otras versiones según sea necesario.

+0

Por favor, vea la pregunta editada. –

+0

Recibo ese mensaje también, investigando ... –

+0

Soy capaz de construir ndk-build con mis instrucciones agregadas –

3

Acabo de añadir

#include <jni.h> 

a cube.c & cuberenderer.c

cambiado

(*g_VM)->AttachCurrentThread (g_VM, (void **) &env, NULL); 

a

(*g_VM)->AttachCurrentThread (g_VM, (const struct JNINativeInterface ***) &env, NULL); 

Mi Android.mk:

LOCAL_PATH:= $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := libgltest_jni 
LOCAL_CFLAGS := -Werror 
LOCAL_SRC_FILES := cube.c cuberenderer.c 
LOCAL_LDLIBS := -llog 
-lGLESv1_CM 

include $(BUILD_SHARED_LIBRARY) 

Mi aplicación.MK:

# The ARMv7 is significanly faster due to the use of the hardware FPU 
APP_ABI := armeabi armeabi-v7a 
APP_PLATFORM := android-9 

Y lo construyó en android-NDK-R6

5

He buscado en la NDK para las instancias de la "/ egl.h EGL" archivo de cabecera. Este ejemplo particular se compilará y ejecutará en el nivel 15 de API de Android, pero algunos otros niveles de API no tienen el encabezado.

+0

llegaron a esta pregunta en busca de cómo compilar ' EGL/egl.h 'encabezado en Android. Esto funcionó para mí. Compilado con 'APP_PLATFORM = android-14' – asloob

-2

Has usado el nombre de archivo GLES/glext.h dos veces.

Cuestiones relacionadas