【问题标题】:android opengl ndk - unimplemented OpenGL ES API errorandroid opengl ndk - 未实现的OpenGL ES API错误
【发布时间】:2025-11-23 19:35:01
【问题描述】:

我正在使用 NDK 为 android 编写一个纯 c++ 应用程序。 我正在尝试编写一个使用 OpenGL 进行 2D 绘图的简单应用程序,因此没有纹理或类似的东西。

我应用了此处发布的所有建议,但仍然得到了

调用未实现的 OpenGL ES API

logcat 中的消息

这是我的清单文件:

<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.native_activity"
        android:versionCode="1"
        android:versionName="1.0">

    <uses-feature android:glEsVersion="0x00020000"></uses-feature>
    <!-- This is the platform API where NativeActivity was introduced. -->
    <uses-sdk android:minSdkVersion="9" />
    <!-- This .apk has no Java code itself, so set hasCode to false. -->
    <application android:label="@string/app_name" android:hasCode="false">
        <!-- Our activity is the built-in NativeActivity framework class.
             This will take care of integrating with our NDK code. -->
        <activity android:name="android.app.NativeActivity"
                android:label="@string/app_name"
                android:configChanges="orientation|keyboardHidden">
            <!-- Tell NativeActivity the name of or .so -->
            <meta-data android:name="android.app.lib_name"
                    android:value="native-activity" />
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest> 

这是代码:

EGLDisplay dpy;
EGLSurface surface;
EGLContext context;

static void android_handle_cmd( struct android_app * app, int32_t cmd ) {

    switch (cmd) {

        case APP_CMD_INIT_WINDOW:

            // The window is being shown, get it ready.
            if ( NULL != app->window ) {

                Init( app );
                drawscreen();

            }
            break;

    }

}


void pixel( int x, int y ) {

    if ( NULL == GLapp.surface ) {

        return;

    }    

    glColor4f( 1.0, 1.0, 1.0, 0 );
    glVertexAttrib2f( 0, x + 0.5, y + 0.5 );

}


void drawscreen( void ) {

    if ( NULL == GLapp.surface ) {

        return;

    }

    eglSwapBuffers( GLapp.dpy, GLapp.surface );

}


int Init( struct android_app * app ) {

    dpy = eglGetDisplay( EGL_DEFAULT_DISPLAY );

    eglInitialize( dpy, 0, 0 );

    const EGLint attribs[] = {

        EGL_SURFACE_TYPE,    EGL_WINDOW_BIT,

        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, // <--- OpenGL ES 2.0

        EGL_BLUE_SIZE,       8,
        EGL_GREEN_SIZE,      8,
        EGL_RED_SIZE,        8,

        EGL_NONE

    };

    EGLConfig config;
    EGLint numConfigs;

    eglChooseConfig( dpy, attribs, &config, 1, &numConfigs );

    EGLint format;

    eglGetConfigAttrib( dpy, config, EGL_NATIVE_VISUAL_ID, &format );

    ANativeWindow_setBuffersGeometry( app->window, 0, 0, format );

    surface = eglCreateWindowSurface( dpy, config, app->window, NULL );

    const EGLint ContextAttribList[] = {

        EGL_CONTEXT_CLIENT_VERSION, 2,
        EGL_NONE

    };

    context = eglCreateContext( GLapp.dpy, config, EGL_NO_CONTEXT, ContextAttribList );

    eglMakeCurrent( dpy, surface, surface, context );

    int XSize;
    eglQuerySurface( GLapp.dpy, GLapp.surface, EGL_WIDTH, &XSize );

    int YSize;
    eglQuerySurface( GLapp.dpy, GLapp.surface, EGL_HEIGHT, &YSize );

    glMatrixMode( GL_PROJECTION );

    glLoadIdentity();

    glOrthof( 0, XSize, YSize, 0, 0, 1 );

    glMatrixMode( GL_MODELVIEW );

    /* Displacement trick for exact pixelization */
    glTranslatef( 0.375, 0.375, 0 );

    glDisable( GL_DEPTH_TEST );

    glClear( GL_COLOR_BUFFER_BIT );

    return 0;

}

我删除了所有错误检查代码以使代码更易于阅读。 Init 函数执行时未检测到任何错误,只有当我调用像素或绘图屏幕(不确定是哪个)函数时,日志才会填满“未实现的 OpenGL ES API”错误

谁能帮忙?

【问题讨论】:

  • 您应该有某种堆栈跟踪/错误消息,有助于找到问题。请将其附加到您的问题中。
  • 未实现的 OpenGL ES API 是错误。除此之外,logcat 没有显示任何可疑内容。该代码在 Nexus 上运行,但不显示任何内容,这就是错误。对不起,我没有更清楚

标签: android opengl-es android-ndk 2d


【解决方案1】:

您的应用程序缺少包含项,我们甚至不知道构建阶段可能出现的错误。

我的建议是看看 NDK 文件夹中的几个示例,并从中学习。

考虑到带有 OpenGL ES 代码的本机活动,您至少应该包括:

#include <jni.h>
#include <errno.h>

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

#include <android/log.h>
#include <android_native_app_glue.h>

但这只是给你一个想法,你可能想要更多。

【讨论】:

    【解决方案2】:

    您要的是 gles 2,但您使用的是 glMatrixMode 之类的东西,它们不是 gles2 api - 不要包含 gl.h,而是使用 gles2.h - 这就是您要的 api .

    【讨论】:

    • 感谢您的回答!我是 OpenGL 的菜鸟。我从来没有想过你不能像那样混合 API 调用。也许我把事情复杂化了太多。我正在尝试将一个非常简单的 OpenGL 应用程序移植到 android。非 android 应用程序调用的 API 是非常基本的 OpenGL,我已经尝试了所有我能想到的在 Android 上工作的方法,包括查看其他 Android 应用程序如何初始化 OpenGL,所以这就是我来到这样一个混搭解决方案。
    • 事实上,我正在尝试做一些非常简单的事情:使用 OpenGL 作为 2D 绘图工具。更简单地说,我希望能够将显示处理为二维像素矩阵。原始代码使用 freeglut 设置 OpenGL,但 Android 上不存在 freeglut。
    • 非android代码初始化如下: int XSize = 1024;整数 YSize = 768; glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(XSize, YSize);过剩创建窗口(“gltest”); glutDisplayFunc(drawscreen); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, XSize, YSize, 0, 0, 1); glMatrixMode(GL_MODELVIEW); glTranslatef(0.375, 0.375, 0); glDisable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT);
    • 如您所见,glMatrixMode(设置 2D 显示)后面的行是相同的。然后,夹在对 glBegin 和 glEnd 的调用之间,对像素函数的调用一次在屏幕上绘制一个图像,然后 drawscreen 函数将其渲染到显示器上。这就是我在这里尝试做的所有事情,没有 3D 或纹理。必须可以在 Android 上使用 Opengl 做同样的事情,只是我是一个 OpenGL 新手,我还没有弄清楚如何......再次感谢您的帮助。
    • 使用 gles 1,而不是 2 - 将 android 清单中的 gles 版本功能标志更改为版本 1,将代码中的 EGL_CONTEXT_CLIENT_VERSION 更改为 1,等等 - 获取另一个处理 gles1 的教程 - 你如果您只是在移植一个老式 gl 应用程序,就不想与 gles2 打交道。
    最近更新 更多