在进行图片特效处理/视频解码时,JAVA处理的速度让人难以接受,理想的方式自然是用C/C++处理。处理后简单的方式自然是将数据返回到JAVA层用canvas绘制,但数据上下的传递毕竟降低效率,最好的方式,还是在C层面进行绘制。
JNI调用以及数据的详细处理方式不在此多述。
SurfaceView中getHolder().getSurface()获取Surface对象
:
从java层传过来的Surface对象,C++中得到jni类型的jobject,命名为jsurface,然后用之来构造nativeSurface
setSurface(env, jsurface, 9); //自定义的函数,源码贴在下面
dirtyRegion.set(android::Rect(0, 0, 176, 144));
status_t err = native_surface->lock(&info, &dirtyRegion); //相当于holder.lockCanvas(); static android::Surface::SurfaceInfo 类型的info变量将初始化
int sformat;
switch(info.format) //获取图像编码格式
{
case PIXEL_FORMAT_RGBA_8888:
case PIXEL_FORMAT_RGBX_8888:
case PIXEL_FORMAT_BGRA_8888:
sformat = 4;
break;
case PIXEL_FORMAT_RGB_888:
sformat = 3;
break;
case PIXEL_FORMAT_RGB_565:
case PIXEL_FORMAT_RGBA_5551:
case PIXEL_FORMAT_RGBA_4444:
sformat = 2;
break;
default:
sformat = -1;
}
sprintf(buf, "width - %d -- height %d-- format %d---Locked -- %d", info.w, info.h, sformat, err); //将命令写入char数组buf
__android_log_print(ANDROID_LOG_INFO, TAG, buf); //打印日志
memset(buf, 0x77, BUFSIZE); //给
memcpy(info.bits, buf, BUFSIZE); 将buf中的数据写入info中
//memcpy(info.bits, bufYUV, len);
native_surface->unlockAndPost(); 绘制
int setSurface(JNIEnv *env, jobject jsurface, jint version)
{
native_surface = getNativeSurface(env, jsurface, version);
if(android::Surface::isValid(native_surface))
{
__android_log_print(ANDROID_LOG_INFO, "libjni", "native_surface is valid");
return 1;
}
else
__android_log_print(ANDROID_LOG_ERROR, "libjni", "native_surface is invalid");
return 0;
}