为了提高刷屏效率,研究了下直接在HAL层刷屏的方法。另外一个好处是这样的能够支持使用YUV 数据直接刷屏。(依赖系统支持)
1:使用surfaceview,并按你要求设置surface的格式和颜色格式
holder.setFormat,holder.setType,注在Android2.0以后,貌似这个方法只支持565了,也没有细看源代码,不知道为什么。
2:在surfaceCreated函数里面,得到surface 对象,并通过JNI 传到HAL层
3:JNI 初始化的时候,得到android/view/Surface里面的一个field: mSurface
4:在JNI 函数里面,mSurface的对应的c指针
sp<Surface> mysurface = (Surface *)env->GetIntField(surface, s_fields.surface);
5:这样就可以使用了这个mysurface了。
if(mysurface->isValid())
{
//log_to_file("display");
Surface::SurfaceInfo info;
/* get data */
MByte *pSrc;
MByte* pDisplay;
status_t err = mysurface->lock(&info, true);
if(err == 0)
{
int width = info.w;
int height = info.h;
int s = info.s;
pDisplay = (MByte*)info.bits;
// Do something...
mysurface->unlockAndPost();
LOGE("width %d height %d info.bits %d info.s %d", width,height, (int)info.bits, info.s);
}else
LOGE("mysurface->lock error, return %d########", err);
}
else
LOGE("mysurface->isValid error########");