我想操作android手机的framebuffer,手机已经获得root权限。在上看到有类似的代码,下载下来,编写遵循jni规范的 c 程序,然后通过ndk编译,在java中调用。整个过程是跑通了的。在之前的几天时间内,我一直都可以打开framebuffer,并且可以mmap里面的数据。可是昨天打开电脑后,我再也不能打开我的手机的framebuffer,代码执行到第一步就返回失败。我检查了所有的代码,并重写了几次,删除其他的操作,只剩下打开framebuffer的操作,依然失败。我换了个有root的板子来测试程序,依然打开失败。经过一天多的重复些代码,查错误,我陷入了绝望。代码如下,请高手指正。感激不尽!
- C/C++ code
#include <stdlib.h>#include <unistd.h>#include <string.h>#include <jni.h>#include <fcntl.h>#include <stdio.h>#include <sys/ioctl.h>#include <sys/mman.h>#include <sys/types.h>#include <time.h>#include <linux/fb.h>#include <linux/kd.h>#include "pixelflinger.h"static GGLSurface gr_framebuffer[2];//handlerstatic int gr_fb_fd = -1;//v screen infostatic struct fb_var_screeninfo vi;//f screen infostruct fb_fix_screeninfo fi;static int get_framebuffer(GGLSurface *fb) //fb是在另一个头文件中定义的保存framebuffer数据的结构体{ int fd; void *bits; fd = open("/dev/graphics/fb0", O_RDWR); //执行到打开这里就失败了 if(fd < 0) { perror("cannot open fb0"); return -1; } if(ioctl(fd, FBIOGET_FSCREENINFO, &fi) < 0) { perror("failed to get fb0 info"); return -1; } if(ioctl(fd, FBIOGET_VSCREENINFO, &vi) < 0) { perror("failed to get fb0 info"); return -1; } bits = mmap(0, fi.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if(bits == MAP_FAILED) { perror("failed to mmap framebuffer"); return -1; } fb->version = sizeof(*fb); fb->width = vi.xres; fb->height = vi.yres; fb->stride = fi.line_length / (vi.bits_per_pixel >> 3); fb->data = bits; fb->format = GGL_PIXEL_FORMAT_RGB_565; fb++; fb->version = sizeof(*fb); fb->width = vi.xres; fb->height = vi.yres; fb->stride = fi.line_length / (vi.bits_per_pixel >> 3); fb->data = (void*) (((unsigned) bits) + vi.yres * vi.xres * 2); fb->format = GGL_PIXEL_FORMAT_RGB_565; return fd;} jstring Java_com_liuqiang_NDKScreenShot2Activity_ScreenShot(JNIEnv* env,jobject thiz) //我删除了其他所有的操作,只是执行打开帧缓冲,一直是"open failed"!!{ gr_fb_fd = get_framebuffer(gr_framebuffer); if (gr_fb_fd < 0) { return (*env)->NewStringUTF(env, "open failed"); } else { return (*env)->NewStringUTF(env, "open succeed"); }}
------解决方案--------------------
//执行到打开这里就失败了
你是指程序挂了?还是错误,如果是错误那errno是多少?
前两天还能打开,说明这中间你改动过什么东西?
------解决方案--------------------
楼主你的报错 是啥啊,framebuffer一般比较难搞
------解决方案--------------------
楼主,可以留个QQ交流下吗?
------解决方案--------------------
在ndk中可以获取framebuffer吗?还有如果可以读的话能够得到深度值吗?我看楼主的都是framebuffer中的colorbuffer,基本没见到和depthbuffer有关的操作啊,QQ:[email protected]
------解决方案--------------------
光有运行时候的ROOT的权限是不够的,在APK安装包安装的时候还要申请其他权限:
1.存储权限(修改,删除USB设备内容)
2.系统工具(装载和卸载文件系统)
3.网络通信(完全的互联网访问权限)
另外安卓市场的有一个应用:ROOT截屏,作者为JOHN ZHENG,可以下来看看