opengles2 glGenVertexArrays glGenVertexArraysOES

У меня есть небольшие проблемы с сортировкой этого. Я создаю свое приложение SDL opengl с помощью cmake на mac os x 10.9, оно отлично работает с этим включенным заголовком

#if defined(__IPHONE__) || defined(__ANDROID__)
    #include "SDL_opengles2.h"
    #include "SDL_opengles2_gl2.h"
    #include "SDL_opengles2_gl2ext.h"
#elif defined(__APPLE__)
#include <OpenGL/gl3.h>
#include <SDL2/SDL_opengl.h>
#endif

Я получаю эту ошибку при попытке сборки с помощью ndk-build

jni/src/mandelbrot.c:100:5: warning: implicit declaration of function 'glGenVertexArrays' [-Wimplicit-function-declaration]
     glGenVertexArrays(1, &vao);
     ^
jni/src/mandelbrot.c:106:5: warning: implicit declaration of function 'glBindVertexArray' [-Wimplicit-function-declaration]
     glBindVertexArray(vao); //bind vertex array buffer

Мне сказали, что на android openles2 это расширение и согласно официальной документации opengl< /а>

вы используете его следующим образом: glGenVertexArraysOES(...) хорошо, что выдает ту же ошибку, что и выше, за исключением того, что вместо этого я использую неявное объявление функции glGenVertexArraysOES.

полный файл android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_CFLAGS += -std=c99

LOCAL_MODULE := main

SDL_PATH := ../SDL
SDL_IMG_PATH := ../SDL2_image

LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include/
LOCAL_C_INCLUDES += $(LOCAL_PATH)/$(SDL_IMG_PATH)/
LOCAL_C_INCLUDES += $(LOCAL_PATH)/$(SDL_IMG_PATH)/external/jpeg-9/
LOCAL_C_INCLUDES += $(LOCAL_PATH)/$(SDL_IMG_PATH)/external/libpng-1.6.2/
LOCAL_C_INCLUDES += $(LOCAL_PATH)/$(SDL_IMG_PATH)/external/libwebp-0.3.0/
LOCAL_C_INCLUDES += $(LOCAL_PATH)/utils/time_utils/
LOCAL_C_INCLUDES += $(LOCAL_PATH)/utils/resource_utils/
LOCAL_C_INCLUDES += $(LOCAL_PATH)/ren_opengl/
LOCAL_C_INCLUDES += $(LOCAL_PATH)/core_math/
LOCAL_C_INCLUDES += $(LOCAL_PATH)/core_math/commons_math/
LOCAL_C_INCLUDES += $(LOCAL_PATH)/core_math/mat4_scalar/
LOCAL_C_INCLUDES += $(LOCAL_PATH)/core_math/vec3_scalar/
LOCAL_C_INCLUDES += $(LOCAL_PATH)/components/renderable2d/
LOCAL_C_INCLUDES += $(LOCAL_PATH)/core_engine/

# Add your application source files here...
LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.c \
                utils/time_utils/time_utils.c \
                utils/resource_utils/resource_utils.c \
                ren_opengl/ren_opengl.c \
                core_math/core_math.c \
                core_math/mat4_scalar/mat4_scalar.c \
                core_math/vec3_scalar/vec3_scalar.c \
                components/renderable2d/renderable2d.c \
                core_engine/core_engine.c \
                mandelbrot.c


LOCAL_SHARED_LIBRARIES := SDL2 SDL2_image

LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -llog

include $(BUILD_SHARED_LIBRARY)

удаление ссылки на opengl1 вручную не влияет на результат сборки.

редактировать в соответствии с ответом @Michaels Выполните следующие действия:

PFNGLGENVERTEXARRAYSOESPROC glGenVertexArraysOES;
glGenVertexArraysOES = (PFNGLGENVERTEXARRAYSOESPROC)eglGetProcAddress ( "glGenVertexArraysOES" );

Я получаю эти сообщения об ошибках:

Brother:android-project blubee$ ndk-build
Android NDK: WARNING: APP_PLATFORM android-21 is larger than android:minSdkVersion 10 in ./AndroidManifest.xml    
[armeabi] Install        : libSDL2.so => libs/armeabi/libSDL2.so
[armeabi] Install        : libSDL2_image.so => libs/armeabi/libSDL2_image.so
[armeabi] Compile thumb  : main <= mandelbrot.c
jni/src/mandelbrot.c:35:1: warning: data definition has no type or storage class [enabled by default]
 glGenVertexArraysOES = (PFNGLGENVERTEXARRAYSOESPROC)eglGetProcAddress ( "glGenVertexArraysOES" );
 ^
jni/src/mandelbrot.c:35:1: warning: type defaults to 'int' in declaration of 'glGenVertexArraysOES' [enabled by default]
jni/src/mandelbrot.c:35:1: error: conflicting types for 'glGenVertexArraysOES'
jni/src/mandelbrot.c:34:29: note: previous declaration of 'glGenVertexArraysOES' was here
 PFNGLGENVERTEXARRAYSOESPROC glGenVertexArraysOES;
                             ^
jni/src/mandelbrot.c:35:1: warning: implicit declaration of function 'eglGetProcAddress' [-Wimplicit-function-declaration]
 glGenVertexArraysOES = (PFNGLGENVERTEXARRAYSOESPROC)eglGetProcAddress ( "glGenVertexArraysOES" );

если я полностью изменю имя на что-то вроде OES1, эта ошибка исчезнет, ​​но потом я получу эти ошибки.

jni/src/mandelbrot.c:54: error: undefined reference to 'eglGetProcAddress'
jni/src/mandelbrot.c:55: error: undefined reference to 'eglGetProcAddress'
jni/src/mandelbrot.c:56: error: undefined reference to 'eglGetProcAddress'
jni/src/mandelbrot.c:57: error: undefined reference to 'eglGetProcAddress'
     ^
    jni/src/mandelbrot.c:35:24: warning: initialization makes integer from pointer without a cast [enabled by default]
     glGenVertexArraysOES = (PFNGLGENVERTEXARRAYSOESPROC)eglGetProcAddress ( "glGenVertexArraysOES" );
                            ^
    jni/src/mandelbrot.c:35:1: error: initializer element is not constant
     glGenVertexArraysOES = (PFNGLGENVERTEXARRAYSOESPROC)eglGetProcAddress ( "glGenVertexArraysOES" );
     ^
    jni/src/mandelbrot.c: In function 'initialized':
    jni/src/mandelbrot.c:102:5: warning: implicit declaration of function 'glGenVertexArrays' [-Wimplicit-function-declaration]
         glGenVertexArrays(1, &vao);
         ^
    jni/src/mandelbrot.c:108:5: warning: implicit declaration of function 'glBindVertexArray' [-Wimplicit-function-declaration]
         glBindVertexArray(vao); //bind vertex array buffer
         ^
    make: *** [obj/local/armeabi/objs/main/mandelbrot.o] Error 1

person user1610950    schedule 17.08.2015    source источник
comment
Вы пробовали подход, предложенный в stackoverflow.com/a/16623860/1524450?   -  person Michael    schedule 17.08.2015
comment
я пробовал это раньше, и вместо этого это просто приводит к ошибкам неопределенной ссылки eglGetProcAddress.   -  person user1610950    schedule 17.08.2015
comment
Вы можете попробовать включить GLES2/gl2ext.h самостоятельно, если заголовок SDL не объявляет glGenVertexArraysOES().   -  person Reto Koradi    schedule 18.08.2015


Ответы (1)


Проверьте этот ответ, используя dlopen вместо eglGetProcAddress: https://stackoverflow.com/a/24878621/1762681

Также проверьте заголовки. Заголовки SDL могут включать определения в дополнение к определениям, определенным в gl.h и glext.h. Включают ли они EGL/egl.h и EGL/eglext.h?

person user1906    schedule 18.08.2015