在GLuint程序上获得段错误= glCreateProgram();在Android原生应用程序中

时间:2016-03-29 13:11:25

标签: android opengl-es android-ndk

我试图获得一个Android原生活动(完全ndk)来运行openGL代码..我已经环顾了很多,并花了很多时间在IRC上。所有的道路都让我无所适从。

在我的app_gradle中,我有以下几行

 ldFlags.add("-lGLESv2")
 ldFlags.add("-lGLESv1_CM")
 ldLibs.addAll(["log", "android", "EGL", "GLESv1_CM", "GLESv2"])

我认为应该链接正确的库(可能有点过分)

在我的代码(main.c)中,我有这个

#include <EGL/egl.h>
#include <GLES/gl.h>
#include <GLES2/gl2.h>

GLuint loadGLProgram() {
  LOGI("GETTING HERE 1");

  GLuint program = glCreateProgram();
  LOGI("GETTING HERE 2");
....
  return program;
}

当我运行此代码时。

...native-activity: GETTING HERE 1
...A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 2965 (native_activity)

我想知道是否有人看过这个,或者是否有人发现/创建了一个真正原生的简单openGL示例。

这是一个更详细的日志。还在挖掘。

03-29 22:13:55.030 1013-1013/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
03-29 22:13:55.030 1013-1013/? A/DEBUG: Build fingerprint: 'Android/sdk_phone_x86_64/generic_x86_64:6.0/MASTER/2524533:userdebug/test-keys'
03-29 22:13:55.030 1013-1013/? A/DEBUG: Revision: '0'
03-29 22:13:55.030 1013-1013/? A/DEBUG: ABI: 'x86'
03-29 22:13:55.030 1013-1013/? A/DEBUG: pid: 2109, tid: 2124, name: com.Little.Aisy  >>> com.Little.Aisy <<<
03-29 22:13:55.030 1013-1013/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
03-29 22:13:55.040 1013-1013/? A/DEBUG:     eax f69d9ec0  ebx eb7b8d58  ecx e7ecd12c  edx e7ecd12c
03-29 22:13:55.040 1013-1013/? A/DEBUG:     esi e4b63930  edi e4b63970
03-29 22:13:55.040 1013-1013/? A/DEBUG:     xcs 00000023  xds 0000002b  xes 0000002b  xfs 00000007  xss 0000002b
03-29 22:13:55.040 1013-1013/? A/DEBUG:     eip 00000000  ebp e4b63748  esp e4b636ec  flags 00210292
03-29 22:13:55.040 1013-1013/? A/DEBUG: backtrace:
03-29 22:13:55.050 1013-1013/? A/DEBUG:     #00 pc 00000000  <unknown>
03-29 22:13:55.050 1013-1013/? A/DEBUG:     #01 pc 00002a66  /data/app/com.Little.Aisy-2/lib/x86/libnative-activity.so
03-29 22:13:55.050 1013-1013/? A/DEBUG:     #02 pc 00003076  /data/app/com.Little.Aisy-2/lib/x86/libnative-activity.so
03-29 22:13:55.050 1013-1013/? A/DEBUG:     #03 pc 00003ab3  /data/app/com.Little.Aisy-2/lib/x86/libnative-activity.so
03-29 22:13:55.050 1013-1013/? A/DEBUG:     #04 pc 00003208  /data/app/com.Little.Aisy-2/lib/x86/libnative-activity.so (android_main+236)
03-29 22:13:55.050 1013-1013/? A/DEBUG:     #05 pc 00003be5  /data/app/com.Little.Aisy-2/lib/x86/libnative-activity.so
03-29 22:13:55.050 1013-1013/? A/DEBUG:     #06 pc 00081933  /system/lib/libc.so (__pthread_start(void*)+56)
03-29 22:13:55.050 1013-1013/? A/DEBUG:     #07 pc 000227f2  /system/lib/libc.so (__start_thread+25)
03-29 22:13:55.050 1013-1013/? A/DEBUG:     #08 pc 000170b6  /system/lib/libc.so (__bionic_clone+70)
03-29 22:13:55.180 1013-1013/? A/DEBUG: Tombstone written to: /data/tombstones/tombstone_08
03-29 22:13:55.180 1013-1013/? E/DEBUG: AM write failed: Broken pipe

1 个答案:

答案 0 :(得分:3)

在评论中,您表示您正在使用以下调用创建上下文:

context = eglCreateContext(display, config, NULL, NULL);

如果将eglCreateContextattrib_list参数一起使用,则将创建GLES 1.0上下文。 GLES 1.0不支持着色器,因此,使用glCreateProgram将导致未定义的行为(在这种情况下崩溃)。要使用GLES 2.0支持创建上下文,请使用以下命令:

EGLint contextAttribs[] =
{
    EGL_CONTEXT_CLIENT_VERSION, 2, // Specifies OpenGL ES 2.0.
    EGL_NONE
};
context = eglCreateContext(display, config, NULL, contextAttribs);