我试图加载一些着色器和渲染的机器人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 tutorial和learnopengles's tutorial。
因此,我认为我的上下文创建有问题
如果您打算冷静地发表我的文章,为什么不留下一些关于如何改进我的问题的反馈?尽我所能,我已经清楚地研究了这个话题。不要成为冲凉袋。 – Jas
您是否确认错误来自您的代码?我认为这些错误消息有时会显示在日志中,而不会与您所做的任何连接相关联,并且可能是无害的。为了缩小问题的范围,我将清晰的颜色设置为黑色以外的其他颜色,并在Java代码中放入一个'glClear()'调用。这将确认上下文创建工作。 –
@RetoKoradi是的,我已经在我的项目的ndk端运行glClear和不同的glClearColors,并且它运行完美!所以也许你是对的,这只是一个无用的错误而我的问题在于别处。谢谢你的提示,我会调查其他部分。 – Jas