http://topic.csdn.net/u/20101224/19/8f3ef883-b950-444c-9b28-824d2d34341b.html你这个回答我没看懂。
我现在想用JNI实现视频图像显示,java层传一个Surface给C,在C中做显示。
Surface::SurfaceInfo info;需要加什么头文件?

解决方案 »

  1.   

    C/C++ code
    int lock_surface(unsigned char **ppbuf, int *width, int *height, int *bpp){
        unsigned short *surfaceBuffer;
        Surface::SurfaceInfo info;
        Region dirtyRegion;
        
        // invalid the whole surface
        dirtyRegion.set(Rect(0x3FFF, 0x3FFF));
        
        if(g_surface == NULL){
            LOGD("Error! surface not initialized!\n");
            return -1;
        }    status_t err = g_surface->lock(&info, &dirtyRegion);
        
        if (err < 0) {
            return -1;
        }    *ppbuf = (unsigned char *)info.bits;
        *width = info.w;
        *height = info.h;    switch(info.format){
            case PIXEL_FORMAT_RGBA_8888:
            case PIXEL_FORMAT_RGBX_8888:
            case PIXEL_FORMAT_BGRA_8888:
                *bpp = 4;
                break;
            case PIXEL_FORMAT_RGB_888:
                *bpp = 3;
                break;
                
            case PIXEL_FORMAT_RGB_565:
            case PIXEL_FORMAT_RGBA_5551: 
            case PIXEL_FORMAT_RGBA_4444:
                *bpp = 2;
                break;        default:
                return -1;
        }    return 0;
    }C/C++ code
    int unlock_and_post_surface(void){    if(g_surface == NULL){
            LOGD("Error! surface not initialized!\n");
            return -1;
        }
        
        return g_surface->unlockAndPost();
    }调用的地方:
    C/C++ code
    if(lock_surface(&graphic_buf, &output_width, &output_height, &bpp) < 0){
        LOGE("ERROR! can not lock canvas");
        continue;
    }
    yuv420_2_rgb565(yuv_location, graphic_buf,
            output_width, output_height, output_width<<1);
    unlock_and_post_surface();怎么获取surfaceView的native surface,从android_view_surface.cpp中剥出来就可以了。
      

  2.   

    对,从android_view_surface.cpp中剥出来就可以了。
      

  3.   

    不太明白,已经用java把surface传到C中了,不能直接用吗?android_view_surface.cpp与其它的文件有关联的,剥离出来也是比较麻烦的。不知道有没有必要。我只是想在C中实现显示图片的功能,用Bitmap画,效率实在太低了。
      

  4.   

    android_view_surface.cpp会用到colorconvert类,还有一下OPENCORE的转用类比如mediatransfer这些你可以不用,主要是调用surfaceflinger.so中的接口去显示的
      

  5.   

    谢谢 OExpress
    有简单的例子吗?
      

  6.   

    int lock_surface(unsigned char **ppbuf, int *width, int *height, int *bpp)
    这个函数中ppbuf传回是绘图的首地址
    你只需要把解码处理的图片数据copy到这个地址里
    然后调用unlock_and_post_surface让surfaceflinger去显示就OK了其实freshui大侠的代码已经讲得很清楚
    如果不明白的话建议去看下surface跟SurfaceFlinger这个部分http://blog.csdn.net/DroidPhone/archive/2010/10/28/5972568.aspx