我正在寻找从 Android GLSurfaceView 快速获取绘图缓冲区的方法。
尽管我知道 glreadpixel 可以完成这项工作,但 glreadpixel 太慢而无法获得绘图缓冲区。
我想读取保持 30 fps 的缓冲区。
ANativeWindow api 似乎是我正在寻找的..
我找不到任何用于 GLSurfaceView 的 ANativeWindow api 示例。
我的程序:
- 将 GLSurfaceView 表面发送到 jni 代码。(使用 GLSurfaceView.getHolder().getSurface())**
- 使用 ANativeWindow_fromSurface 方法获取窗口句柄。**
- 设置窗口缓冲区**
- 锁定表面并获取窗口缓冲区**
- 使用此缓冲区做某事**
- UnlockAndPost 窗口**
我使用Android“BasicGLSurfaceView”示例尝试了下面的jni代码。
JNIEXPORT void JNICALL Java_com_example_android_basicglsurfaceview_BasicGLSurfaceViewActivity_readSurface(JNIEnv* jenv, jobject obj, jobject surface)
{
LOG_INFO("Java_com_example_android_basicglsurfaceview_BasicGLSurfaceViewActivity_readSurface");
if (surface != 0) {
ANativeWindow *window = ANativeWindow_fromSurface(jenv, surface);
LOG_INFO("Got window %p", window);
if(window > 0)
{
int width = ANativeWindow_getWidth(window);
int height = ANativeWindow_getHeight(window);
LOG_INFO("Got window %d %d", width,height);
ANativeWindow_setBuffersGeometry(window,0,0,WINDOW_FORMAT_RGBA_8888);
ANativeWindow_Buffer buffer;
memset((void*)&buffer,0,sizeof(buffer));
int lockResult = -22;
lockResult = ANativeWindow_lock(window, &buffer, NULL);
if (lockResult == 0) { \
LOG_INFO("ANativeWindow_locked");
ANativeWindow_unlockAndPost(window);
}
else
{
LOG_INFO("ANativeWindow_lock failed error %d",lockResult);
}
LOG_INFO("Releasing window");
ANativeWindow_release(window);
}
} else {
LOG_INFO("surface is null");
}
return;
}
ANativeWindow_fromSurface 和 getHeight、setBuffersGeometry api 运行良好。
但是 ANativeWindow_lock api 总是无法返回 -22 值。
错误信息
[Surfaceview] 连接:已连接(cur=1,req=2)
我在渲染器或主线程或 onSurfaceChanged 的 onDrawFrame 上尝试了此代码。
但总是它返回 -22 值。
我在错误的地方调用这个 api?
是否可以将 ANativeWindow_lock 用于 GLSurfaceView?
任何帮助将不胜感激~