当前位置: 代码迷 >> Android >> android framebuffer 操作(小弟我承认这有关问题让人无所适从,当小弟我焦头烂额的时候,还是把最后丝希望寄托于csdn)
  详细解决方案

android framebuffer 操作(小弟我承认这有关问题让人无所适从,当小弟我焦头烂额的时候,还是把最后丝希望寄托于csdn)

热度:189   发布时间:2016-05-01 15:12:04.0
android framebuffer 操作(我承认这问题让人无所适从,当我焦头烂额的时候,还是把最后丝希望寄托于csdn)
我想操作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,可以下来看看
  相关解决方案