Reputation: 301
While trying to execute a program based on C++ in android via NDK platform, the compilation is giving error that 'gl.h' and 'glext.h' header files are not found, as I have included both of them in my C++ code. M using android-ndk-r8 and compiling it with Cygwin.
here s my code:
**ANDROID.MK**
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := NDK1
FILE_LIST := $(wildcard $(LOCAL_PATH)/*.cpp)
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)
include $(BUILD_SHARED_LIBRARY)
---
**APPLICATION.MK**
APP_STL := stlport_static
APP_ABI := armeabi armeabi-v7a
APP_PLATFORM := android-3
---
**Viewer.cpp**
#include <iostream>
#import "OpenGLES/ES2/gl.h"
#import "OpenGLES/ES2/glext.h"
//#import <GLKit/GLKEffects.h>
#import <GLKit/GLKMath.h>
#include "Viewer.h"
void Viewer::render() {
glClearColor(0.65f, 0.65f, 0.65f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindVertexArrayOES( _vertexArray[0]);
// Render the object with GLKit
glDrawArrays(GL_TRIANGLES, 0, 36);
/////////
glBindVertexArrayOES(_vertexArray[1]);
// Render the object with GLKit
//[self.effect prepareToDraw];
glDrawArrays(GL_TRIANGLES, 0, 36);
}
void Viewer::initialize() {
sceneObj.constructDemoScene();
glEnable( GL_DEPTH_TEST);
///////////////////////////////////
glGenVertexArraysOES(1, &_vertexArray[0]);
glBindVertexArrayOES( _vertexArray[0]);
glGenBuffers(1, &_vertexBuffer[0]);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer[0]);
H3DModel * model = sceneObj.get3DModel(0);
float * vertices = model->vertexBuffObj.getVertices();
for (int c = 0; c < 216; c++)
printf("%f\t", vertices[c]);
glBufferData(GL_ARRAY_BUFFER, 216 * 4, vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray( EVertexAttribPosition);
glVertexAttribPointer(EVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24,
(void*) offsetof(Vertex, position));
glEnableVertexAttribArray( EVertexAttribNormal);
glVertexAttribPointer(EVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24,
(void*) offsetof(Vertex, normal));
///////////////////////////////////
glGenVertexArraysOES(2, &_vertexArray[1]);
glBindVertexArrayOES(_vertexArray[1]);
glGenBuffers(2, &_vertexBuffer[1]);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer[1]);
H3DModel * model1 = sceneObj.get3DModel(1);
float * vertices1 = model1->vertexBuffObj.getVertices();
for (int c = 0; c < 216; c++)
printf("%f\t", vertices[c]);
glBufferData(GL_ARRAY_BUFFER, 216 * 4, vertices1, GL_STATIC_DRAW);
glEnableVertexAttribArray(EVertexAttribPosition);
glVertexAttribPointer(EVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24,
(void*) offsetof(Vertex, position));
glEnableVertexAttribArray(EVertexAttribNormal);
glVertexAttribPointer(EVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24,
(void*) offsetof(Vertex, normal));
glBindVertexArrayOES(0);
}
void Viewer::unInitialize() {
glDeleteBuffers(1, &_vertexBuffer[0]);
glDeleteBuffers(2, &_vertexBuffer[1]);
glDeleteVertexArraysOES(1, &_vertexArray[0]);
glDeleteVertexArraysOES(2, &_vertexArray[1]);
if (_program) {
glDeleteProgram( _program);
_program = 0;
}
}
GLKMatrix4 Viewer::update() {
GLKMatrix4 baseModelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f,
-4.0f);
baseModelViewMatrix = GLKMatrix4Rotate(baseModelViewMatrix, _rotation,
0.0f, 1.0f, 0.0f);
// Compute the model view matrix for the object rendered with GLKit
//GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -1.5f);
//modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, _rotation, 1.0f, 1.0f, 1.0f);
//modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix);
//self.effect.transform.modelviewMatrix = baseModelViewMatrix;
/*// Compute the model view matrix for the object rendered with ES2
modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, 1.5f);
modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, _rotation, 1.0f, 1.0f, 1.0f);
modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix);
_normalMatrix = GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix), NULL);
_modelViewProjectionMatrix = GLKMatrix4Multiply(projectionMatrix, modelViewMatrix);*/
_rotation += 0.04f;
return baseModelViewMatrix;
}
Thanks in advance..i want to know how to use OPENGL ES in android ndk !!
Upvotes: 1
Views: 6571
Reputation: 11
Do not know if this issue is still common. I just had this issue and found one solution. It turned out the file "Application.mk" was needed in the "jni" directory.
This is my "Application.mk":
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi armeabi-v7a
APP_PLATFORM := android-14
I think "APP_PLATFORM := android-14" informed Android of using Opengl ES. In fact, "APP_PLATFORM := android-5" is the minimum requirement for OpenGL 2.x.
Upvotes: 0
Reputation: 11
I think you were trying to build in the jni directory. Try again in the root directory of the Android project.
Upvotes: 1
Reputation: 12917
There is no such thing as #import
in C/C++. Also you need to increase APP_PLATFORM
level. OpenGL ES 1 is available only stating from android-4
and OpenGL ES 2 is available from android-5
. It's all in the documentation: docs/STABLE-APIS.html
file.
Upvotes: 1
Reputation: 3182
Not quite sure, but I believe if you looking into the sample code provided by google ndk, it could be a great help.
the sample code located at
android-ndk-r7b\samples\hello-gl2\jni\gl_code.cpp
If compare the Android.mk, you will find your
LOCAL_LDLIBS := -llog -lGLESv2
is missing. The Android.mk provided by Google is looks like below:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libgl2jni
LOCAL_CFLAGS := -Werror
LOCAL_SRC_FILES := gl_code.cpp
LOCAL_LDLIBS := -llog -lGLESv2
include $(BUILD_SHARED_LIBRARY)
and also, in the cpp source code, android is using :
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
Upvotes: 5