普通应用使用Surface的方法

news/2024/6/29 12:02:08 标签: jni, buffer, 编译器, android, java, null

Android的NDK提供了Surface类,可供应用向屏幕绘图,但使用这个类,有很多机关,
如果不注意,代码就不会正常工作。
下面是我们使用的时候遇到的问题与解决方法。

1,在C++代码里要使用Surface类,必须在APK的工程文件Android.mk里增加权限

uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER"
如果没有这句,则创建Surface会失败。

2,创建Surface

//sp client;
client = new SurfaceComposerClient();
// 然后向 Surfaceflinger 申请一个 Surface , surface 类型为 PushBuffers

DisplayInfo dispInfo;
client->getDisplayInfo(0,&dispInfo);

int ok = client->initCheck();

// 创建Surface,颜色为32位;ePushBuffers表示buffer由我们提供
surfaceControl = client->createSurface(getpid(), 0, 800, 600,
PIXEL_FORMAT_RGBA_8888, ISurfaceComposer::ePushBuffers);
if (surfaceControl == NULL) {
return JNI_FALSE;
}

// 设置位置,大小以及Z-order
client->openTransaction();
surfaceControl->setPosition(0, 0);
surfaceControl->setSize(800, 600);
surfaceControl->setLayer(99999);
surfaceControl->show();
client->closeTransaction();

3,获取ISurface对象
// 这一句需要权限,要在surface.h里加入frends class
isurface = Test::getISurface(surfaceControl);
这里使用了一个技巧,具体参见“欺骗编译器取得ISurface对象的方法”

4,注册buffer

static const char* pmem = "/dev/pmem";

// 这一句需要root权限
heap = new MemoryHeapBase(pmem, 800 * 600 * 4);
if (heap->heapID() < 0) {
return JNI_FALSE;
}
sp pmemHeap = new MemoryHeapPmem(heap, 0);
if (pmemHeap->getHeapID() >= 0) {
// pmemHeap->slap();
// heap.clear();
// pmemHeap.clear();
return JNI_FALSE;
}

mBufferHeap = ISurface::BufferHeap(800, 600,
800, 600, PIXEL_FORMAT_BGRA_8888, pmemHeap);

int ret = isurface->registerBuffers(mBufferHeap);
这里,因为要打开/dev/pmem设备文件,因此需要有权限,方法很简单,就是root手机,
然后使用命令
chmod a+rw /dev/pmem
来增加权限。
用完后记得复原,否则可能有安全风险。
在代码里修改权限参见“调用Su命令修改设备文件权限的Java代码”。

5,得到buffer指针
char * bp = static_cast(mBufferHeap.heap->base());

6,向buffer写位图数据,注意要是32位的
具体写的代码请参见“向Surface写位图数据的方法”

7,提交修改,通知Surface Flinger更新屏幕
isurface->postBuffer(0);

这样屏幕上就可以看到显示了。


http://blog.sina.com.cn/s/blog_53d1e55b0100ne4x.html


http://www.niftyadmin.cn/n/1720021.html

相关文章

linux c语言链表的简单应用之创建链表

/************************************************************************* * Filename: link.c * Description: * Version: 1.0 * Created: 2011骞?4鏈?9鏃?17鏃?2鍒?3绉? * Revision: none * Compiler: gcc * Author: wen hao (WH), hnrain1004gmail.com * Compan…

python类属性@property(全) tcy

1.属性属性定义&#xff1a;python中属性其实是普通方法的衍生属性操作&#xff1a;用property装饰器操作类属性用类或实例直接操作类属性obj.name,obj.age18,del obj.age用python内置函数操作属性属性意义&#xff1a;访问属性时类似访问字段象,属性由方法衍生而来,如Python没…

向Surface写位图数据的方法

Surface的Buffer准备好后&#xff0c;就可以向Buffer写位图数据&#xff0c; Surface的Buffer跟普通的图像数据一样&#xff0c;也是按一定格式组织的一根根的扫描线数据。 下面的例子假设源和目的格式都是32位&#xff0c;并且大小不超标 uint8_t *sbits; sbits (uint8_t *…

atexit函数基本应用

很多时候我们需要在程序退出的时候做一些诸如释放资源的操作&#xff0c;但程序退出的方式有很多种&#xff0c;比如main()函数运行结束、在程序的某个地方用exit() 结束程序、用户通过CtrlC或Ctrlbreak操作来终止程序等等&#xff0c;因此需要有一种与程序退出方式无关的方法来…

pyqt5线程的启动停止终止的两种方法tcy

QtCore.QThread 休眠启动中断 2020/8/2实例1&#xff1a;休眠启动 #!/usr/bin/env python # -*- coding: utf-8 -*- from PyQt5.QtCore import QThread, QWaitCondition, QMutex, pyqtSignal from PyQt5.QtWidgets import QWidget, QVBoxLayo…

Android ISurface PostBuffer 处理流程

1 ISurface 的Create 想了解surface的create 和surfaceflinger 可参考这篇文章&#xff0c;比较详细&#xff1a; http://blog.csdn.net/yili_xie/archive/2009/11/12/4803527.aspx Android 起步比较早的大牛们挺多&#xff0c;我现在只能一步步踏着革命先烈的后尘。 每个相应…

python struct (tcy)

1.1.用途 执行Python值和表示为bytes对象C结构之间转换,将Python基本类型转换成byte. 用于处理文件或网络中的二进制数据以及其他来源;1.2.说明&#xff1a; python中bstr表示字节,字节数组&#xff1d;二进制str C语言用struct、union处理字节,以及字节和int,float的…

Android Overlay学习

前文仅了解了overlay HAL的架构&#xff0c;下面继续看看系统层是如何调用Overlay模块。 1、 测试代码 frameworks/base/libs/surfaceflinger/tests/overlays/overlays.cpp提供了一个简单的overlay调用流程&#xff0c;可惜这个测试程序有错误&#xff0c; 在sp<Su…