尝试通过NDK平台在android中执行基于C ++的程序时,编译错误地找不到“gl.h”和“glext.h”头文件,因为我已将它们都包含在我的C ++代码。 M使用android-ndk-r8并用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;
}
先谢谢..我想知道如何在android ndk中使用OPENGL ES !!
答案 0 :(得分:4)
不太确定,但我相信如果您查看google ndk提供的示例代码,可能会有很大的帮助。
位于
的示例代码 android-ndk-r7b\samples\hello-gl2\jni\gl_code.cpp
如果比较Android.mk,你会找到你的
LOCAL_LDLIBS := -llog -lGLESv2
缺少。 Google提供的Android.mk如下所示:
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)
并且,在cpp源代码中,android正在使用:
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
答案 1 :(得分:1)
在C / C ++中没有#import
这样的东西。您还需要增加APP_PLATFORM
级别。 OpenGL ES 1只能从android-4
开始提供,而OpenGL ES 2可从android-5
获得。这些都在文档中:docs/STABLE-APIS.html
文件。
答案 2 :(得分:1)
我认为您正在尝试构建jni目录。再次尝试Android项目的根目录。
答案 3 :(得分:0)
不知道这个问题是否仍然普遍存在。我刚遇到这个问题并找到了一个解决方案。事实证明,“jni”目录中需要“Application.mk”文件。
这是我的“Application.mk”:
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi armeabi-v7a
APP_PLATFORM := android-14
我认为“APP_PLATFORM:= android-14”告诉Android使用Opengl ES。实际上,“APP_PLATFORM:= android-5”是OpenGL 2.x的最低要求。