framebuffer 提取图形数据 android工程
大虾门。最近鄙人在研究android手机抓屏技术,用的是android+ndk+jni,利用framebuffer 在dev/graphics/fb0 下提取数据。暂时只成功打开fb0,想提取里边的数据,返回一个byte数组(在.so库中)。已经写好代码(copy一盟友代码,本人c功底太差,稍微改了一下),但是事实证明代码有问题能编译成库文件,但是运行安卓工程时程序一直是意外终止。请大虾门指导一下,告诉我问题到底出在哪里,c基础太差,翻了好多资料也没找到问题。感激不尽。返回byte数组的代码如下(供java调用的c语言中的代码):
JNIEXPORT jbyteArray Java_com_xyy_ndk_HelloAndroidNDK_SendPicThread_1ScreenShot
(JNIEnv* env,jobject thiz )
{
_fb = get_framebuffer();
if (_fb <= 0)
{
return NULL;
}
else
{
int w = vi.xres, h = vi.yres, depth = vi.bits_per_pixel; //每一象素的bit数
long int _ScreenSize=w*h*depth/8;//计算屏幕的总大小(字节)
long int _size=_ScreenSize/4;
jbyteArray test;
byte a[_size];//前边定义了char为byte,因为c中貌似没有byte类型
memcpy(a, bits,_ScreenSize);
test=(*env)->NewByteArray(env,_size);
(*env)->SetByteArrayRegion(env,test,0,_size, a);
munmap(bits, _ScreenSize);
close(_fb);
return test;
}
求高手指点。。。
[解决办法]
你确保高和宽都是4或8的整数倍吗?改成+7)/8或+3)/4试一下?
[解决办法]
C中unsigned char 就是byte.
把错误信息贴出来看看,看这个看不出什么问题。
错误信息logcat里面可以看到。
我估计是找不到库,加载库失败这类的错误。。。。。。
[解决办法]
你确保高和宽都是4或8的整数倍吗?改成+7)/8或+3)/4试一下
w*h*depth 求的是整个屏幕有多少位
/8 是求的一个屏幕的字节数, /4我其实也不知道怎么回事,就是原文这么写,我也这么写。
[解决办法]
[解决办法]
JNIEXPORT jbyteArray Java_com_xyy_ndk_HelloAndroidNDK_SendPicThread_1ScreenShot
(JNIEnv* env,jobject thiz )
{
int fd;
fd = open("/dev/graphics/fb0", O_RDWR);
if(fd < 0) {
perror("cannot open fb0");
}
if(ioctl(fd, FBIOGET_FSCREENINFO, &fi) < 0) {
perror("failed to get fb0 info");
}
if(ioctl(fd, FBIOGET_VSCREENINFO, &vi) < 0) {
perror("failed to get fb0 info");
}
bits = mmap(0, 48000, PROT_READ
[解决办法]
PROT_WRITE, MAP_SHARED, fd, 0);
if(bits == MAP_FAILED) {
perror("failed to mmap framebuffer");
}
int w = vi.xres;
int h = vi.yres;
int depth = vi.bits_per_pixel; //每一象素的bit数
long int _ScreenSize=w*h*depth/8;//计算屏幕的总字节数(字节)
long int _size=_ScreenSize/4;
jbyteArray test=(*env)->NewByteArray(env,_size);
unsigned char a[_size];
memcpy(a,bits,_size);
(*env)->SetByteArrayRegion(env,test,0,_size, a);
munmap(bits, _ScreenSize);
close(_fb);
return test;
}
有米有接触过android手机抓屏技术的高手啊。。。求指点。现在这段代码可以返回数据,但是返回的全是-1,形成的图片也是黑的。。真黑啊。。这是为什么啊。我代码究竟错在那里啊。。大神们帮我看一下把。。我快支持不了了,。。