Android:使用 NDK 进行 OpenGL 渲染

标签 android c++ opengl-es native

我正在尝试运行一个简单的测试应用程序,该应用程序是我使用 San Angeles 演示作为引用构建的。目前(在我的 native /cpp 代码中)我只在调整大小时调用 glViewport,在渲染帧时调用 glClearColor 和 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)。动态加载 opengl 库时出现问题(通过 dlopen("libGLESv1_CM.so", RTLD_NOW)); dl open 成功,我找到了符号,但是即使我已将清除颜色设置为绿色,屏幕仍保持黑色。另一方面,如果我不导入符号,似乎一切正常。

我已经看了几次 San Angeles 的演示,看不出我可能错过了什么。非常感谢任何想法/建议。我的导入代码如下:

uint32 ImportOpenGL()
{
    uint32 uResult = 0;

    glesLib = dlopen("libGLESv1_CM.so", RTLD_NOW);

    if (!glesLib)
        return 1;

#define GL_IMPORT_FUNC(funcName)                                                    \
    {                                                                               \
        *((void **)&(funcPtr_##funcName)) = (void *)dlsym(glesLib, #funcName);  \
        if(!funcPtr_##funcName)                                                     \
        {                                                                           \
            LOGW("Could not load OpenGL symbol: %s", #funcName);                    \
            uResult = (!uResult ? 2 : uResult);                                     \
        }                                                                           \
    }

    GL_IMPORT_FUNC(glBlendFunc);
    GL_IMPORT_FUNC(glClear);
    GL_IMPORT_FUNC(glClearColorx);
    GL_IMPORT_FUNC(glClearColor);
    GL_IMPORT_FUNC(glColor4x);
    GL_IMPORT_FUNC(glColorPointer);
    GL_IMPORT_FUNC(glDisable);
    GL_IMPORT_FUNC(glDisableClientState);
    GL_IMPORT_FUNC(glDrawArrays);
    GL_IMPORT_FUNC(glEnable);
    GL_IMPORT_FUNC(glEnableClientState);
    GL_IMPORT_FUNC(glFrustumx);
    GL_IMPORT_FUNC(glGetError);
    GL_IMPORT_FUNC(glLightxv);
    GL_IMPORT_FUNC(glLoadIdentity);
    GL_IMPORT_FUNC(glMaterialx);
    GL_IMPORT_FUNC(glMaterialxv);
    GL_IMPORT_FUNC(glMatrixMode);
    GL_IMPORT_FUNC(glMultMatrixx);
    GL_IMPORT_FUNC(glNormalPointer);
    GL_IMPORT_FUNC(glPopMatrix);
    GL_IMPORT_FUNC(glPushMatrix);
    GL_IMPORT_FUNC(glRotatex);
    GL_IMPORT_FUNC(glScalex);
    GL_IMPORT_FUNC(glShadeModel);
    GL_IMPORT_FUNC(glTranslatex);
    GL_IMPORT_FUNC(glVertexPointer);
    GL_IMPORT_FUNC(glViewport);

#undef GL_IMPORT_FUNC

    if(!uResult)
    {
        LOGI("Successfully imported OpenGL symbols");
    }

    return uResult;
}

最佳答案

您确定您正确定义了 ponters 吗? (我指的是如何将参数传递给函数的方法)

例如,glEnable 是这样定义的:

GL_API void GL_APIENTRY glEnable (GLenum cap);

其中 GL_API 是 KHRONOS_APICALL:

#if defined(_WIN32) && !defined(__SCITECH_SNAP__)
#   define KHRONOS_APICALL __declspec(dllimport)
#elif defined (__SYMBIAN32__)
#   define KHRONOS_APICALL IMPORT_C
#elif defined(__ANDROID__)
#   define KHRONOS_APICALL __attribute__((visibility("default")))
#else
#   define KHRONOS_APICALL
#endif

GL_APIENTRY 是 KHRONOS_APIENTRY:

#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__)
/* Win32 but not WinCE */
#   define KHRONOS_APIENTRY __stdcall
#else
#   define KHRONOS_APIENTRY
#endif

因此,您不得__stdcall 添加到您的指针声明中,即 GLES 函数使用默认的 __cdecl 约定(而不是 __fastcall)。

关于Android:使用 NDK 进行 OpenGL 渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8619096/

相关文章:

android - Android 1.6 上的 java.lang.VerifyError 和 getActionBar()

android - 一种尺寸适合所有屏幕分辨率

ios - 了解核心视频 CVPixelBufferPool 和 CVOpenGLESTextureCache 语义

android - 使用具有 curl /翻转效果的 muPDF

Android Activity 生命周期 - 重新启动(销毁)应用程序不会删除对(自定义)监听器的引用?

android - 动画导航栏颜色Android

java - 使用 canvas 和 surfaceview 在 Android 上使用 Java 双缓冲

c++ - 运行时错误 : Illegal file open (/dev/tty)

c++ - 如何在 C++ 中使用自定义消息抛出 std::bad_alloc?

c++ - UDP 客户端未正确形成数据包