2016-06-27 72 views
-1

我试图加载一些着色器和渲染的机器人GLSurfaceView和C++使用官方NDK一个Hello World三角形。但是,我收到错误“调用OpenGL ES API没有当前上下文”。这是我简单的单个文件的Java(注意,这是在整个项目中唯一的Java代码)从google's tutorial端环境创建代码:的Android GL没有当前上下文

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进行渲染。例如:Intel's tutoriallearnopengles's tutorial

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

+0

如果您打算冷静地发表我的文章,为什么不留下一些关于如何改进我的问题的反馈?尽我所能,我已经清楚地研究了这个话题。不要成为冲凉袋。 – Jas

+1

您是否确认错误来自您的代码?我认为这些错误消息有时会显示在日志中,而不会与您所做的任何连接相关联,并且可能是无害的。为了缩小问题的范围,我将清晰的颜色设置为黑色以外的其他颜色,并在Java代码中放入一个'glClear()'调用。这将确认上下文创建工作。 –

+0

@RetoKoradi是的,我已经在我的项目的ndk端运行glClear和不同的glClearColors,并且它运行完美!所以也许你是对的,这只是一个无用的错误而我的问题在于别处。谢谢你的提示,我会调查其他部分。 – Jas

回答

0

忘了回答这个问题。出现这个问题是因为C++的默认构造函数系统。在我的OpenGL上下文创建之前,我正在加载我的“native_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(...) 
     .... 
    } 
}; 

因此,这是一个错误偷偷摸摸隐藏在坏的面向对象设计我的一部分。

相关问题