尝试以下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?
我对这块也不熟悉,希望你解决了能把方案跟大家分享。