首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

framebuffer 提取图形数据 android工程,该如何处理

2012-12-15 
framebuffer提取图形数据android工程大虾门。最近鄙人在研究android手机抓屏技术,用的是android+ndk+jni,利

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我其实也不知道怎么回事,就是原文这么写,我也这么写。
[解决办法]

引用:
C中unsigned char 就是byte.

把错误信息贴出来看看,看这个看不出什么问题。

错误信息logcat里面可以看到。

我估计是找不到库,加载库失败这类的错误。。。。。。


能加载到库,这个我十分肯定,随意我能断定是库里边的函数出现问题。logcat里边没有任何报错信息,而且肯定就是这段代码出现了问题。不能成功都取或者返回数据。导致程序终止。郁闷的是它不报错。c语言能力太差,研究了一天怎么也不知道如何把数据以byte数组的形式传给java


[解决办法]
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,形成的图片也是黑的。。真黑啊。。这是为什么啊。我代码究竟错在那里啊。。大神们帮我看一下把。。我快支持不了了,。。

热点排行