本帖最后由 Wind_Runner 于 2009-11-30 16:59:56 编辑

解决方案 »

  1.   

    read the article about surface, maybe you can get the answer ~~http://hi.csdn.net/link.php?url=http://blog.csdn.net%2Fyili_xie
      

  2.   


    你好,多谢回复!
    但你给的地址只是对surfaceflinger的总体框架介绍,这部分我已稍有了解,
    只是具体到其中的细节,就出现了问题,不知能否更近一步的指导指导,我的问题应该描述清楚了吧
      

  3.   

    可以这样做。 把surface的对象通过jni的方法传到C层,然后直接在C层利用这个surface对象绘图。 部分相关代码如下:
    void JNICALL xxxxxxxxxxxxxxxxxxxxxxxx
            (JNIEnv *env, jobject thisObj, jobject objSurface)
    {
        jclass   cls;
        jfieldID fld;
        jobject objCanvas;
        jint nativeCanvas, outSurface;    cls = (*env)->GetObjectClass(env, objSurface);
        /* Surface: get native surface */
        fld = (*env)->GetFieldID(env, cls, "mSurface", "I");
        outSurface = (*env)->GetIntField (env, objSurface, fld);    /* Surface: get canvas instance */
        fld = (*env)->GetFieldID(env, cls, "mCanvas", "Landroid/graphics/Canvas;");
        objCanvas = (*env)->GetObjectField (env, objSurface, fld);    /* Canvas: get native canvas */
        cls = (*env)->GetObjectClass(env, objCanvas);
        fld = (*env)->GetFieldID(env, cls, "mNativeCanvas", "I");
        nativeCanvas = (*env)->GetIntField (env, objCanvas, fld);    /* If the canvas is null, something really bad happened. Assert fatal. */
        if (nativeCanvas == 0)
        {
            doThrow(env, "java/lang/IllegalArgumentException",
                "ERROR: initializeGFX: NULL nativeCanvas");
            CRTL_printf("ERROR: initializeGFX: NULL nativeCanvas");
        }最后绘图的部分:
    err = surface->lock(&info, &dirtyRegion, true);/* Blocking */
    memcpy(info.bits, sharedFramebuffer, imageBufferSize);
    err = surface->unlockAndPost();希望对你有用
      

  4.   

    这种方法可以试试,我想问的是我那种方法可能错在什么地方?对于ISurface 接口,需要重新new一块内存区给它吗?崩溃是否就是这个原因造成的?多谢!
      

  5.   

    请问outSurface到最后的surface是怎么转换的啊?
      

  6.   

    也许段错误是因为
    const sp<Surface>& native_surface = get_surface_remotemonitor(env, surface);
    这句代码.因为你取的是一个强制类型转换的结果的引用...
    我一直想验证sp<T>这个类在传递这种强制类型转换结果的时候,是否会传递的是中间变量...
    但实在是不好做