如何抓住Android的GLSurfaceView创建的OpenGL上下文?

时间:2014-08-20 20:15:42

标签: android opengl-es opencl

我正在尝试开发一款Android应用来处理(在OpenCL中)相机预览的每一帧。预览是使用Android的GLSurfaceView和SurfaceTexture实现的,它们使用OpenGL。我的问题是,从JNI方面来说,我不知道如何掌握OpenGL上下文。

我正在尝试按照英特尔的Maxim Shevtsov撰写的这篇优秀文章OpenCL and OpenGL Interoperability Tutorial。 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上下文。

解决我的问题的任何想法和想法?

非常感谢

2 个答案:

答案 0 :(得分:1)

我相信您可以通过与NativeActivity源演示的类似方式找到您要查找的内容。

NativeActivity附带了android-ndk / samples / NativeActivity中的SDK并调用了eglCreateContext(),但是有类似的调用,例如eglGetCurrentContext()与NDK中可用的EGL引用相关联。您应该能够通过这些API以这种方式检索上下文。

答案 1 :(得分:1)

在我们的代码中,上下文是用Java创建的,然后控制只是通过JNI传递给C.

我们使用eglGetCurrentContext()作为Jay提到的CL_GL_CONTEXT_KHR属性,另外作为CL_EGL_DISPLAY_KHR属性我们使用eglGetCurrentDisplay()。这些已经在我们测试的所有Android设备上运行。