Android GL没有当前上下文

Android gl no current context

本文关键字:上下文 GL Android      更新时间:2023-10-16

我试图使用官方NDK使用Android glsurfaceview和C 渲染一些Hello World Triangle。但是,我会遇到错误"呼叫openGL es api,而没有当前上下文"。这是我简单的单个文件Java(请注意,这是整个项目中唯一的Java代码)side上下文创建代码从Google的教程:

class GLESRenderer implements GLSurfaceView.Renderer
{
    static {
        System.loadLibrary("native_code");
    }
    private native void ntInit();
    private native void ntRender();
    private native void ntUpdateScreen(int width, int height);
    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
        ntInit(); // LOAD SHADERS AND VBO DATA!!!!
    }
    public void onDrawFrame(GL10 unused) {
        ntRender(); // DRAW USING SHADERS AND VBO DATA!!!!
    }
    public void onSurfaceChanged(GL10 unused, int width, int height) {
        ntUpdateScreen(width, height); // UPDATE SCREEN!!!
    }
}
class GLES_SurfaceView extends GLSurfaceView {
    private final GLESRenderer mRenderer;
    public GLES_SurfaceView(Context context){
        super(context);
        setEGLContextClientVersion(2);
        mRenderer = new GLESRenderer();
        setRenderer(mRenderer);
    }
}
public class Main extends Activity {
    private GLSurfaceView mGLView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mGLView = new GLES_SurfaceView(this);
        if(Build.VERSION.SDK_INT < 16) {
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        } else {
            View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
            ActionBar bar = getActionBar();
            if(bar != null)
                bar.hide();
        }
        setContentView(mGLView);
    }
}

许多其他堆栈溢出问题(没有使用NDK,所以它们可能是不同的问题)表明这是一个线程问题,但是此代码清楚地调用了GlSurfaceview.renderer的本机函数,所以我很确定这不是线程问题。

此外,多个教程使用了使用OpenGL和NDK渲染的相同方法。例如:英特尔教程和Learnopengles的教程。

因此,我认为我的上下文创建有问题

忘了回答这个问题。由于C 的默认构造函数系统而出现此问题。在创建OpenGL上下文之前,我正在加载我的"本机_Code"库。但是,我的本地着色器类有默认的构造函数,可以调用openGL调用以初始化自己。这样的东西:

class LightingShader
{
    LightingShader()
    {
        glCreateShader(...) // BAD TO CALL OPENGL HERE WITHOUT CONTEXT CREATED
        ....
    }
};
....
LightingShader light_shader; // <- GLOBAL VARIABLE, DEFAULT CONSTRUCTOR CALLED!!!!

基本上,当它们库被加载时,C 着色器会自动调用其构造函数。在开OpenGL初始化之前,该库是被调用的!我通过删除默认构造函数并使用返回对象的函数来解决此问题:

class LightingShader
{
    LightingShader getLightingShaderInstance()
    {
        glCreateShader(...)
        ....
    }
};

因此,这是一个偷偷摸摸的错误,隐藏在我的面向不良对象的设计中。