大虾门。最近鄙人在研究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我其实也不知道怎么回事,就是原文这么写,我也这么写。
------解决方案--------------------
能加载到库,这个我十分肯定,随意我能断定是库里边的函数出现问题。logcat里边没有任何报错信息,而且肯定就是这段代码出现了问题。不能成功都取或者返回数据。导致程序终止。郁闷的是它不报错。c语言能力太差,研究了一天怎么也不知道如何把数据以byte数组的形式传给java