在C/C++层面讲解析好的图片/视频绘制到Surface上面显示

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值