当前位置: 代码迷 >> Android >> framebuffer 提取图形数据 android工程,该如何处理
  详细解决方案

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

热度:180   发布时间:2016-05-01 12:34:16.0
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
  相关解决方案