Android GL没有当前上下文
Android gl no current context
我试图使用官方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(...)
....
}
};
因此,这是一个偷偷摸摸的错误,隐藏在我的面向不良对象的设计中。
相关文章:
- #为""定义宏;静态";针对不同的上下文
- 与互斥锁相比,旋转锁可以保证上下文切换
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 错误"Could not find Boost"(缺少:上下文标头)
- 使用 mod_gsoap 部署服务时,如何在 Gsoap 中更改 soap 上下文的模式?
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- 安排带有上下文的协同程序
- 我的文件无法正常工作,无法从C++文件中读取上下文
- Visual Studio 19-17 库兼容性根据 GL 标志
- DCMTK 了解"DIMSE 没有有效的演示上下文 ID"错误
- 识别安卓中意外的 GL 上下文丢失
- Android GL没有当前上下文
- 在QT中创建RAW GL上下文
- GL 上下文销毁
- QMainWindow菜单栏:OpenGL触发的功能导致GL上下文问题
- 设置 GL 上下文时'framebuffer'的目的是什么?
- glewInit() 失败与 "Missing GL version" , SDL2 OpenGL 上下文, cygwin 编译器