我正在尝试开发一款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上下文。
解决我的问题的任何想法和想法?
非常感谢
答案 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设备上运行。