三星 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 套接字?