我刚开始在android上学习OpenGL ES(使用this book)并遇到了从第5章采用source代码到在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)
答案 0 :(得分:17)
这些库由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平台内查看你的包含。您可以根据需要将其更改为其他版本。
答案 1 :(得分:5)
我在NDK中搜索了“EGL / egl.h”头文件的实例。此特定示例将在Android API级别15上编译和运行,但某些其他API级别没有标题。
答案 2 :(得分:3)
我刚刚添加了
#include <jni.h>
要 cube.c&amp; 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上构建它
答案 3 :(得分:-2)
您使用了文件名GLES / glext.h两次。