最好能提供一个简单的示例. . 谢谢先 
 

解决方案 »

  1.   

    求jni 实现 Surface  显示例子  
      

  2.   

    surface是android私有的接口,不建议使用,不保证一直能用。
    android 2.2 以前的, 接口变化不大, 2.2 之后的, 变化很大,不通用了。至于如何使用, 看源代码: android_view_surface.cpp弄一个surfaceView和一个surfaceHolder,通过JNI在native端获取这个surface后,就可以lock它,然后在上面画图,画完后unlockandpost就可以了。2.2之后,google开放了个bitmap的接口,可以在native端画图了,可以看ndk的例子:bitmap-plasma
      

  3.   


     你好 !   目前我就卡在  lock它,然后在上面画图 这步了. 请问你有没有例子呢  
      

  4.   


    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;
    }int unlock_and_post_surface(void){ if(g_surface == NULL){
    LOGD("Error! surface not initialized!\n");
    return -1;
    }

    return g_surface->unlockAndPost();
    }
    调用的地方: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中剥出来就可以了。
      

  5.   


     非常感谢 .这些代码在NDK 环境能编译通过吗 ?  是不是需要源码环境 ?  
      

  6.   

    NDK上, 要把framework下合system下的一些头文件拷过去, 还有几个链接的库拷过去就可以了。
    如果不想这么麻烦,就在源码上编译
      

  7.   


      麻烦你方便的时候给出份编译时需要的文件列表.谢谢先   我对android 源码、 c | c + 都不是很熟
      

  8.   


    你好. 请问一下.  我下载的android 源代码怎么样没有 framework 这个文件夹 ?  
      

  9.   

    少打一个sframework的大部分头文件在
    frameworks\base\include
    system的头文件在
    system\core\include库就从
    out\target\product\generic\system\lib
    下拷就可以了。前提是你要先编译一下。
      

  10.   

    我下载的源码 . 为什么没有这些文件  ? android_view_Surface.cpp 都找不到
      

  11.   

    如果下载正确, 在frameworks\base\core\jni
    下面。如果这些都没有, 那就没下载成功。froyo下载下来后, 看下文件夹的大小,大概在2G左右。
      

  12.   


    现在下载成功了. 在虚似机 make 了一下午 .  卡住不动了 
      

  13.   

    external/opencore/android/android_surface_output.h
    external/opencore/android/android_surface_output.cpp
      

  14.   

    这是opencore对surface的抽象,能满足你的要求。我曾据此写播放器的surface。
      

  15.   

    对,这个Opencore中的代码也很有价值:
    external/opencore/android/android_surface_output.h
    external/opencore/android/android_surface_output.cpp
      

  16.   

    不懂的地方太多了,学习NDK技术
      

  17.   


    2.2之后,google开放了个bitmap的接口,可以在native端画图了,可以看ndk的例子:bitmap-plasma它这个例子只是把bitmap的接口传到NDK层吧,在NDK层画完还是要返回JAVA层才能用这个bitmap对象吧!!!