【问题标题】:Install OpenGL ES and compile code for android安装 OpenGL ES 并为 android 编译代码
【发布时间】:2011-07-15 02:45:06
【问题描述】:

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

所以问题是如何安装这些库(AFAIU、OpenGL ES 和 EGL 安装)并编译最简单的本机代码? (教程备受推崇)。

提前致谢。

编辑:我已经按照建议尝试了 glbuffer 示例(稍微更改了 .mk 文件),但仍然没有成功。编译器给我的结果和以前一样:

ndk 构建

编译拇指:egl

/path/jni/cube.c:5:21: error: GLES/gl.h: No such file or directory // 包含 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)

【问题讨论】:

  • 我翻阅了那本书,它让我无法使用本机代码。当我开始尝试它时,我只是查看了一些示例源代码,获取了一个示例 .mk 文件并重命名了一些东西,然后我就开始运行了。那本书是不是无缘无故地过于复杂了,还是在最近的 NDK 版本发布之前你必须这样做?
  • @Poldie,这并不复杂,它只需要双重修订。此外它有点过时了,所以它告诉了很多对于快速学习来说是多余的东西,尽管知道它很有用。示例可以很好地进行更改,但是当我来到 GL 时,我无法编译它。 Java 部分运行良好。

标签: android c opengl-es compilation android-ndk


【解决方案1】:

这些库由 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-build
  • 是的,我添加了一个带有 target=android-8 字符串的 default.properties 文件并编译了它(glbuffer)。
  • 嗯.. 我还是太慢了。 :D 感谢您的帮助。至于书的来源,家伙用一个单独的 arm gcc 和从 android 设备中提取的库编译,所以他在其中使用了 EGL/egl.h 之类的东西,不确定它是否是严格要求的,或者这个库是否是自动获取的。将不得不检查。再次感谢!
  • 编译器会出现一些语法错误,但这是另一回事。我成功编译了 glbuffer,所以其他一切都是我“保护”源的下一个任务,并且大部分都是微不足道的。
  • # 由于使用了硬件 FPU APP_ABI := armeabi armeabi-v7a APP_PLATFORM := android-9 这也解决了我的问题
【解决方案2】:

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

【讨论】:

  • 来到这个问题,寻找如何在 Android 中编译 EGL/egl.h 标头。这对我有用。编译使用APP_PLATFORM = android-14
【解决方案3】:

我刚刚加了

#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)

我的应用程序.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 上构建它

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多