繁体   English   中英

安装OpenGL ES并为android编译代码

[英]Install OpenGL ES and compile code for android

我刚刚开始在android上学习OpenGL ES(使用这本书 ),并且遇到了从第5章采用代码到在android中使用jni的现有方法的问题(实际上,它还涉及简单地运行原生GL应用程序)。 我正在尝试编译本机代码以获取.so lib并在.apk存档中进一步使用它。 但是如果不存在某些库(GLES / gl.h,EGL / egl.h,GLES / gl.h,GLES / glext.h),则无法进行编译。

所以问题是如何安装这些库(AFAIU,OpenGL ES和EGL安装)并编译最简单的本机代码? (教程非常受人尊敬)。

提前致谢。

编辑:我已经尝试了glbuffer示例(略有改动.mk文件),但仍然没有成功。 编译器给我的结果与以前相同:

NDK建造

编译拇指:egl <= cube.c

/path/jni/cube.c:5:21:错误:GLES / gl.h:当包含gl.h时,没有这样的文件或目录// glbuffer的相同消息

这是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); }

它非常微不足道,但还没有工作。

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)

这些库由Android本身提供。 但是,设置项目以找到它们并正确编译JNI(本机)代码可能会令人生畏。

我建议使用glbuffer作为开始项目,因为它将为您提供一个GLSurfaceView来绘制并为您设置适当的Android库。

链接到Android库的详细信息包含在该项目中的jni/Android.mk ,如果您想从头开始自己动手。

编辑 - 显然glbuffer缺少jni/Application.mk 创建它并将其放入:

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

然后ndk将知道在android-8平台内查找你的包含。 您可以根据需要将其更改为其他版本。

我在NDK中搜索了“EGL / egl.h”头文件的实例。 此特定示例将在Android API级别15上编译和运行,但某些其他API级别没有标头。

我刚才补充道

#include <jni.h>

到cube.c&cuberenderer.c

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

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

我的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)

我的Application.mk:

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

并在android-ndk-r6上构建它

您使用了文件名GLES / glext.h两次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM