【发布时间】:2014-08-20 20:15:41
【问题描述】:
我正在尝试开发一个 Android 应用程序来处理(在 OpenCL 中)相机预览的每一帧。预览是通过使用 OpenGL 的 Android 的 GLSurfaceView 和 SurfaceTexture 实现的。我的问题是,从 JNI 方面来看,我不知道如何获取 OpenGL 上下文。
我正在努力关注这篇出色的文章,OpenCL and OpenGL Interoperability Tutorial,作者是 Intel 的 Maxim Shevtsov。 Maxim 的文章假设读者已经创建了 OpenGL 上下文,并且 OpenGL 上下文和 HDC 都可用。对于大多数人来说,这是一个很好的起点。然而,这就是我的挑战所在。
我用来创建 OpenGL 上下文的 Java 代码是这样的:
// SurfaceView
public class CamGLView extends GLSurfaceView
{
CamGLViewRenderer mRenderer;
CamGLView(Context context) {
super(context);
mRenderer = new CamGLViewRenderer(this);
setEGLContextClientVersion(3); //OpenGL context is created, but how to get hold of it from JNI side ?
setRenderer((Renderer)mRenderer);
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}
......
}
// Renderer
public class CamGLViewRenderer implements GLSurfaceView.Renderer, SurfaceTexture.OnFrameAvailableListener
{
@Override
public void onSurfaceCreated(GL10 unused, EGLConfig config) {
mSTexture = new SurfaceTexture(mTexID[0]);
if (null == mSTexture) {
Log.e(mTag, "Creating SurfaceTexture failed !");
return;
}
mSTexture.setOnFrameAvailableListener(this);
// Setup the camera preview
try {
mCamera.setPreviewTexture(mSTexture);
} catch(IOException ioe)
{
Log.e(mTag, "Camera.setPreviewTexture Error! " + ioe.getMessage());
ioe.printStackTrace();
return;
}
}
......
}
Android 应用已启动并正在运行。显示相机预览。现在在 JNI 端,我想抓取每个预览帧,将其发送到 OpenCL 内核进行处理,然后将其发送回 OpenGL 进行显示。首先,我需要 JNI 端的 OpenGL 上下文。
有什么想法和想法可以解决我的问题吗?
非常感谢
【问题讨论】:
-
如果你看GLSurfaceView的SDK源码,你会发现代码很糟糕。改进它并编写自己的 GLSurfaceView。在我拥有的一台设备上,我必须这样做,因为我得到的只是黑屏。