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

Posted

技术标签:

【中文标题】三星 Galaxy S3 上的原生窗口渲染问题【英文标题】:Native window rendering issue on Samsung Galaxy S3 【发布时间】:2012-06-26 16:25:05 【问题描述】:

我正在使用 Skia(预构建)在一个 android 本机窗口中绘制,这是我从 Java 表面获得的。该代码在我可以测试的所有设备上都运行良好,除了三星 Galaxy S3(上面装有 android 4.0.4)。第一张图是我应该看到的,第二张图出现在 Galaxy S3 上:

绘制矩形的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);

我在以下设备上测试过,没有问题:

Sony X8 (android 2.3.7 自定义rom) 三星 Nexus S (android 4.0.4) 三星 Galaxy Tab 10.1 (android 3.2) 三星 Galaxy S2 (android 2.3.5) 模拟器(android 4.0.3,与 Galaxy S3 相同的屏幕尺寸和 dpi)

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

到目前为止,只有 Galaxy S3 给我带来麻烦,此时我不知道该怎么办,我什至无法判断问题是与 ndk 原生窗口 api 还是与skia,或者它与使用 TouchWiz 的 Galaxy S3 相关...欢迎任何想法!

【问题讨论】:

【参考方案1】:

您需要考虑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);

【讨论】:

以上是关于三星 Galaxy S3 上的原生窗口渲染问题的主要内容,如果未能解决你的问题,请参考以下文章

三星 Galaxy S3 上的 Android 相机预览不正确

三星 Galaxy S3 Android 浏览器上的 Web 套接字?

三星 Galaxy S3 中的位图问题

三星 Galaxy S3 4.1.1 版中的相机强制关闭问题

三星 Galaxy S3 的媒体查询

相机意图不适用于三星 Galaxy S3