做个播放器项目,android 4.0平台下参考 havlenapetr-FFMpeg 开源项目,java层传surface到native层,native层把YUV420转成RGB565,然后显示。解码是正确的。结果显示图像尺寸,本意是要显示176*144,结果是占个整个屏幕。 图像也根本就不正确,都是线条。 有经验的人士支个招!非常感谢!已经折磨我一个星期了!using namespace android;static Surface* sSurface;
static SkBitmap sBitmapClient;
static SkBitmap sBitmapSurface;static Surface* getNativeSurface(JNIEnv* env, jobject jsurface) {
jclass clazz = env->FindClass("android/view/Surface");
jfieldID field_surface = env->GetFieldID(clazz, "mNativeSurface", "I");
if(field_surface == NULL) {
__android_log_print(ANDROID_LOG_ERROR, TAG, "GetFieldID ERROR, field_surface == NULL!");
return NULL;
}
return (Surface *) env->GetIntField(jsurface, field_surface);
}static int initBitmap(SkBitmap *bitmap, int format, int width, int height, bool allocPixels) {
switch (format) {
        case PIXEL_FORMAT_RGBA_8888:
            bitmap->setConfig(SkBitmap::kARGB_8888_Config, width, height);
            break;

        case PIXEL_FORMAT_RGBA_4444:
            bitmap->setConfig(SkBitmap::kARGB_4444_Config, width, height);
            break;

        case PIXEL_FORMAT_RGB_565:
__android_log_print(ANDROID_LOG_INFO, TAG, "setConfig:PIXEL_FORMAT_RGBA_565");
            bitmap->setConfig(SkBitmap::kRGB_565_Config,
                width, height);
            break;

        case PIXEL_FORMAT_A_8:
            bitmap->setConfig(SkBitmap::kA8_Config, width, height);
            break;

        default:
__android_log_print(ANDROID_LOG_INFO, TAG, "setConfig:kNo_Config");
            bitmap->setConfig(SkBitmap::kNo_Config,
                width, height);
            break;
    }

if(allocPixels) {
bitmap->setIsOpaque(true);
//-- alloc array of pixels
if(!bitmap->allocPixels()) {
return -1;
}
}
return 0;
}int AndroidSurface_register(JNIEnv* env, jobject jsurface) {
__android_log_print(ANDROID_LOG_INFO, TAG, "registering video surface");

sSurface = getNativeSurface(env, jsurface);
if(sSurface == NULL) {
     return ANDROID_SURFACE_RESULT_JNI_EXCEPTION;
}

__android_log_print(ANDROID_LOG_INFO, TAG, "registered");

return ANDROID_SURFACE_RESULT_SUCCESS;
}int AndroidSurface_getPixels(int width, int height, void** pixels) {
__android_log_print(ANDROID_LOG_INFO, TAG, "getting surface's pixels %ix%i", width, height);
if(sSurface == NULL) {
return ANDROID_SURFACE_RESULT_JNI_EXCEPTION;
}
if(initBitmap(&sBitmapClient, PIXEL_FORMAT_RGB_565, width, height, true) < 0) {
return ANDROID_SURFACE_RESULT_COULDNT_INIT_BITMAP_CLIENT;
}
*pixels = sBitmapClient.getPixels();
__android_log_print(ANDROID_LOG_INFO, TAG, "getted");
return ANDROID_SURFACE_RESULT_SUCCESS;
}static void doUpdateSurface() {
SkCanvas canvas(sBitmapSurface);
SkRect surface_sBitmapClient;
SkRect surface_sBitmapSurface;
SkMatrix matrix;

surface_sBitmapSurface.set(0, 0, sBitmapSurface.width(), sBitmapSurface.height());
surface_sBitmapClient.set(0, 0, sBitmapClient.width(), sBitmapClient.height());
matrix.setRectToRect(surface_sBitmapClient, surface_sBitmapSurface, SkMatrix::kFill_ScaleToFit);

canvas.drawBitmapMatrix(sBitmapClient, matrix);
}static int prepareSurfaceBitmap(Surface::SurfaceInfo* info) {
if(initBitmap(&sBitmapSurface, info->format, info->w, info->h, false) < 0) {
return -1;
}
sBitmapSurface.setPixels(info->bits);
return 0;
}int AndroidSurface_updateSurface() {
static Surface::SurfaceInfo surfaceInfo;
if(sSurface == NULL) {
return ANDROID_SURFACE_RESULT_JNI_EXCEPTION;
}

if (!sSurface->isValid()) {
return ANDROID_SURFACE_RESULT_NOT_VALID;
}
if (sSurface->lock(&surfaceInfo) < 0) {
return ANDROID_SURFACE_RESULT_COULDNT_LOCK;
}

if(prepareSurfaceBitmap(&surfaceInfo) < 0) {
return ANDROID_SURFACE_RESULT_COULDNT_INIT_BITMAP_SURFACE;
}

doUpdateSurface();

if (sSurface->unlockAndPost() < 0) {
return ANDROID_SURFACE_RESULT_COULDNT_UNLOCK_AND_POST;
}
return ANDROID_SURFACE_RESULT_SUCCESS;
}