在进行图片特效处理/视频解码时,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;
}