我正在使用 Skia(预构建)在 android native 窗口中绘制,这是我从 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);
}
我在以下设备上进行了测试,没有问题:
我尝试调用 ANativeWindow_setBuffersGeometry(window,0,0,0) 没有运气(无论如何,窗口锁定后缓冲区的尺寸和格式似乎没问题)。
到目前为止,只有 Galaxy S3 给我带来了麻烦,此时我不知道该怎么办,我什至无法判断问题出在 ndk 原生窗口 api 还是与skia有关,或者可能与使用 TouchWiz 的 Galaxy S3 ......欢迎任何想法!
最佳答案
您需要考虑 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);
关于android-ndk - 三星 Galaxy S3 上的原生窗口渲染问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11211773/