当前位置: 代码迷 >> Android >> 用android的native surface来显示视频画面无效,熟悉ndk的达人请入!解决办法
  详细解决方案

用android的native surface来显示视频画面无效,熟悉ndk的达人请入!解决办法

热度:87   发布时间:2016-05-01 11:58:02.0
用android的native surface来显示视频画面无效,熟悉ndk的达人请入!
尝试以下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.我记得java层跟C++层的相素显示不同,一个RGBA,一个是ARGB,显示图像需要做转换(至少openGL是这样)

2.为什么采用这种C++反调java的方法?效率问题么?直接把数据传到java层让SurfaceView去画不可以么?

3.Java层本身的SurfaceView中的surface就是从C++层拿到的,我的理解是不是你可以直接在C++层去拿surface,而不是调java,java又通过jni调C++拿到surface?

我对这块也不熟悉,希望你解决了能把方案跟大家分享。
  相关解决方案