三星Galaxy S3上的原生窗口渲染问题

时间:2012-06-26 16:25:06

标签: android-ndk samsung-mobile skia

我正在使用Skia(预建)来绘制一个Android原生窗口,我从java表面获取。代码在我可以测试的每个设备上都运行良好,除了三星Galaxy S3(安装了android 4.0.4)。第一个图像是我应该看到的,第二个图像出现在Galaxy S3上:

Screenshot of the test on an emulator: shows a red rectangle Screenshot of the test on a Samsung Galaxy S3: shows a series of red-on-black diagonal stripes

绘制矩形的jni函数是:

JNIEXPORT void JNICALL Java_com_test_TestSkia_InitializeWindow(JNIEnv* env, jobject thiz, jobject surface)
{
     ANativeWindow* window = ANativeWindow_fromSurface(env, surface);
     ANativeWindow_Buffer buffer;
     ANativeWindow_lock(window, &buffer, NULL);
     SkBitmap  bitmap;
     bitmap.setConfig(convertPixelFormat(buffer.format), buffer.width, buffer.height);
     bitmap.setPixels(buffer.bits);
     SkCanvas canvas;
     canvas.setBitmapDevice(bitmap);
     SkRect rectRed;
     rectRed.setXYWH(30,30,400,700);
     SkPaint paint;
     paint.setColor(SK_ColorRED);
     canvas.drawRect(rectRed,paint);
     ANativeWindow_unlockAndPost(window);
}

我在以下设备上进行了测试,没有问题:

  • 索尼X8(android 2.3.7自定义ROM)
  • Samsung Nexus S(android 4.0.4)
  • 三星Galaxy Tab 10.1(android 3.2)
  • 三星Galaxy S2(android 2.3.5)
  • 仿真器(android 4.0.3,与星系S3相同的屏幕尺寸和dpi)

我试着调用ANativeWindow_setBuffersGeometry(窗口,0,0,0)没有运气(无论如何,窗口锁定后缓冲区的尺寸和格式似乎没问题。)

到目前为止,只有Galaxy S3给我带来了麻烦,此时我不知道该怎么做,我甚至无法判断问题是与ndk原生窗口api或skia有关,还是可能是与使用TouchWiz的星系S3有关......任何想法都会受到欢迎!

1 个答案:

答案 0 :(得分:2)

您需要考虑buffer.stride。您的图片清楚地显示您正在buffer.stride != buffer.width

我无法测试,但可能以下更改就足够了:

 SkBitmap bitmap;
 SkBitmap::Config cfg = convertPixelFormat(buffer.format);
 bitmap.setConfig(cfg, buffer.width, buffer.height,
       SkBitmap::ComputeBytesPerPixel(cfg) * buffer.stride);