读书人

用android的native surface来显示视频

发布时间: 2013-01-26 13:47:03 作者: rapoo

用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?

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

读书人网 >Android

热点推荐