NDK图形函数在某些机型下显示花屏的问题

简介: NDK使用ANativeWindow渲染surface,大致代码如下:ANativeWindow *nativeWindow = ANativeWindow_fromSurface(e...

NDK使用ANativeWindow渲染surface,

大致代码如下:

ANativeWindow *nativeWindow = ANativeWindow_fromSurface(env, surface);
if (nativeWindow == 0) {
	LOGE("ANativeWindow_window_from_surface error;env[0x%x] surface[0x%x]", env, surface);
	return NULL;
}

int err = ANativeWindow_setBuffersGeometry(nativeWindow, width, height, WINDOW_FORMAT_RGB_565);
if ( err < 0 ) {
	LOGE("ANativeWindow_setBuffersGeometry error");
	return NULL;
}


LOGI("AnativeSurface_Draw param invalid. %d | %d | %d | %d | %d | %d", env, NativeSurface, ImgData, dataLen, width, height);
if (env == NULL || NativeSurface == NULL || ImgData == NULL
			|| dataLen == 0 || width == 0 || height == 0) {
	LOGE("AnativeSurface_Draw param invalid. %d | %d | %d | %d | %d | %d", env, NativeSurface, ImgData, dataLen, width, height);
	return ;
}

ANativeWindow_Buffer windowBuffer;
int nlocked = ANativeWindow_lock((ANativeWindow*)NativeSurface, &windowBuffer, 0);
if (nlocked < 0) {
	LOGW("AnativeSurface lock error:%d", nlocked);
	return;
}

if (windowBuffer.bits != NULL) {
	memcpy(windowBuffer.bits, ImgData, dataLen);
}

ANativeWindow_unlockAndPost((ANativeWindow*)NativeSurface);

ANativeWindow_release((ANativeWindow*)NativeSurface);

在测试的过程中,发现有些机型上出现花屏的现象,经内存拷贝测试,发现这些机型上,windowbuffer.bits的大小不等于 width * height * RGBSIZE,因此会导致数据错位而无法正常显示。


翻了下native_window.h(development/ndk/platforms/android-x/include/android目录下),对于windowBuffer的定义如下:

typedef struct ANativeWindow_Buffer {
    // The number of pixels that are show horizontally.
    int32_t width;

    // The number of pixels that are shown vertically.
    int32_t height;

    // The number of *pixels* that a line in the buffer takes in
    // memory.  This may be >= width.
    int32_t stride;

    // The format of the buffer.  One of WINDOW_FORMAT_*
    int32_t format;

    // The actual bits.
    void* bits;
    
    // Do not touch.
    uint32_t reserved[6];
} ANativeWindow_Buffer;

其中一个叫stride的项,表示在内存中每一行包含的像素数量,这个值可能会大于width。


再次测试,发现所有有问题的机型,果然stride大于width。因此在拷贝的时候需要注意内存对齐。。


最后解决方案如下:

    if (windowBuffer.bits != NULL) {
    	//memcpy(windowBuffer.bits, ImgData, dataLen);
    	if (windowBuffer.width == windowBuffer.stride) {
    		memcpy(windowBuffer.bits, ImgData, dataLen);
    	} else {
    		for (int ii=0; ii < windowBuffer.height; ii++) {
    			char *srcPointer = ImgData + windowBuffer.width * ii * 2;
    			char *dstPointer = ((char *)windowBuffer.bits) + windowBuffer.stride * ii * 2;

    			memcpy(dstPointer, srcPointer, windowBuffer.width * 2);
    		}
    	}
    }



目录
相关文章
|
编解码 Android开发
Android native层实现MediaCodec编码H264/HEVC
Android平台在上层实现mediacodec的编码,资料泛滥,已经不再是难事,今天给大家介绍下,如何在Android native层实现MediaCodec编码H264/HEVC,网上千篇一律的接口说明,这里不再赘述,本文主要介绍下,一些需要注意的点,权当抛砖引玉,相关设计界面如下:
441 0
|
机器学习/深度学习 算法 vr&ar
数学建模三大类模型适用场景及建模方法(纯干货)
如果评价指标个数过多(一般超过9个),利用层次分析法所得到的权重就有-定的偏差,继而组合评价模型的结果就不再可靠。可以根据评价对象的实际情况和特点,利用一定的方法,将各原始指标分层和归类,使得每易各类中的指标数少于9个。
4545 0
数学建模三大类模型适用场景及建模方法(纯干货)
|
11月前
|
存储 Prometheus 监控
评估系统的可用性时间
评估系统可用性时间是指对系统在预定时间内正常运行的能力进行测量和分析,以确保其稳定性和可靠性满足用户需求。这通常涉及对系统故障率、恢复时间和维护周期的综合考量。
|
9月前
|
人工智能 自然语言处理 搜索推荐
《解锁鸿蒙Next系统人工智能语音助手开发的关键步骤》
在鸿蒙Next系统上开发人工智能语音助手应用,需经历环境搭建、权限申请、集成语音识别、自然语言处理、语音合成及智能交互逻辑设计等关键步骤。开发者使用DevEcoStudio工具,引入Core Speech Kit和NLP服务,实现从语音输入到文本理解再到语音输出的全流程开发。通过多轮对话、个性化功能和全面测试优化,打造稳定可靠的语音助手应用,提供智能便捷的用户体验。
458 22
|
10月前
|
SQL 存储 关系型数据库
SQL自学笔记(3):SQL里的DCL,DQL都代表什么?
本文介绍了SQL的基础语言类型(DDL、DML、DCL、DQL),并详细说明了如何创建用户和表格,最后推荐了几款适合初学者的免费SQL实践平台。
600 3
SQL自学笔记(3):SQL里的DCL,DQL都代表什么?
|
Java Android开发 UED
安卓应用开发中的内存管理优化技巧
在安卓开发的广阔天地里,内存管理是一块让开发者既爱又恨的领域。它如同一位严苛的考官,时刻考验着开发者的智慧与耐心。然而,只要我们掌握了正确的优化技巧,就能够驯服这位考官,让我们的应用在性能和用户体验上更上一层楼。本文将带你走进内存管理的迷宫,用通俗易懂的语言解读那些看似复杂的优化策略,让你的开发之路更加顺畅。
250 2
|
运维 容灾 算法
Docker Swarm 节点维护
Docker Swarm 节点维护
|
canal 关系型数据库 MySQL
Mysql数据库平滑扩容解决高并发和大数据量问题 1
Mysql数据库平滑扩容解决高并发和大数据量问题
552 0
|
Web App开发 缓存
brew装snappy
brew装snappy,我在mac上已经开了socks5代理,也尝试了lantern或者duotai.org,结果都下载不动。 解决方法:把snappy包手动从浏览器下载,然后放到缓存目录,再执行brew安装,会用缓存文件安装。
2399 0
|
前端开发 图形学 异构计算
Unity优化之Drawcall
Unity优化之Drawcall
892 0