尝试以下4个步骤用native surface来显示画面,但屏幕总是黑的,哪位能帮忙看看问题出在哪吗?谢谢!1. 先用以下代码得到native surface,且log都是显示成功的。static jint getNativeSurface(JNIEnv* env, jobject jsurface, int sdkVersion) { 
    
   jclass clazz = (*env)->GetObjectClass(env,jsurface);
    if(clazz == NULL) {
        LOGE("Can't find surface class!");
        return NULL;
    }    jfieldID field_surface = (*env)->GetFieldID(env,clazz,
                                             sdkVersion > SDK_VERSION_FROYO ? "mNativeSurface" : "mSurface",
                                             "I");
    if(field_surface == NULL) {
        LOGE("Can't find native surface field!");
        return NULL;
    }
    LOGE("OK... find native surface field!");
    return (*env)->GetIntField(env,jsurface,field_surface);
   
}
2.调用libsurfaceflinger_client.so中的lock函数,如下:  sys->s_lock(surf, info, 1);  //其中surf是上面getNativeSurface的返回值3.直接刷红屏:
  memset(info->bits,0xf800,iofo->w*info->h);//如果成功后再换成真正的视频帧4.调用libsurfaceflinger_client.so中的unlock函数:  sys->s_unlockAndPost(surf);//move to flip_page其中unlockAndPost和s_lock是用dlsym从libsurfaceflinger_client.so中得到的函数指针。

解决方案 »

  1.   

    顶~ 有做过native显示的朋友指导一下好吗
      

  2.   

    简而言之就是,在native层可不可以对lock一个surface后得到的Surfaceinfo.bits,直接写入rgb565的数据?
      

  3.   

    1.我记得java层跟C++层的相素显示不同,一个RGBA,一个是ARGB,显示图像需要做转换(至少openGL是这样)2.为什么采用这种C++反调java的方法?效率问题么?直接把数据传到java层让SurfaceView去画不可以么?3.Java层本身的SurfaceView中的surface就是从C++层拿到的,我的理解是不是你可以直接在C++层去拿surface,而不是调java,java又通过jni调C++拿到surface?我对这块也不熟悉,希望你解决了能把方案跟大家分享。
      

  4.   

    这个代码是VLC  video_output下面的androidsurface.c把
    这个代码我也和楼主一样,黑屏
    楼主解决了没有?
      

  5.   

    4.0以上的版本不建议使用surface画图,会存在lock不上的问题