jni,fwrite写不进去,但是返回的确是字符块数

dontsaymiss 2011-11-09 09:25:08
static int
mywrite(JNIEnv *env,jobject thiz,jbyteArray byts){
const jbyte *buf;
buf=(*env)->GetByteArrayElements(env,byts,NULL);
int len ;
len = (*env)->GetArrayLength(env,byts);
FILE *fp;
if(fp=fopen("/data/data/1.txt","w")){
return fwrite(buf,len,1,fp); //就是这里的问题
else return -2;
}

返回值是1,说明文件是打开了,但是1.txt却是0字节,之前用return len返回的是len的长度没问题、
...全文
196 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dontsaymiss 2011-11-09
  • 打赏
  • 举报
回复
我那个串口发送红外的东西是公司自己做上去的,如果要调试只能在公司做的机器上调试不能用虚拟机,比较麻烦。。。
dontsaymiss 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lengxujun 的回复:]

C/C++ code
fwrite(buf,len,1,fp);

返回值是1是正常的,因为你的第3个参数是1。
注意fwrite()的返回值不是1 * len,而是第三个参数的值。
fwrite()是按“块”,或者说“单元”写的,返回的也是成功写到文件的“块”或者“单元”的个数。
可查看msdn.

另外,文件操作为了提高速度,所以实际每一个的写操作并一定是写到文件里去,可能是写……
[/Quote]

是的。我实际上做的是android通过串口发送一个命令出去,所以我先做写进文件这一步验证我android传过来的数据是否可用。但是现在我用

int fd;
fd = open (dev, O_RDWR);
write(fd,buf,len);
close(fd);
return fd;

来替换

FILE *fp;
if(fp=fopen("/data/data/1.txt","w")){
int a = fwrite(buf,len,1,fp);
fclose(fp);
return a;}
else return -2;

却出了同样的问题,能给android返回fd的值,但是数据没法出去,又要开始纠结了。。。
lengxujun 2011-11-09
  • 打赏
  • 举报
回复
fwrite(buf,len,1,fp);

返回值是1是正常的,因为你的第3个参数是1。
注意fwrite()的返回值不是1 * len,而是第三个参数的值。
fwrite()是按“块”,或者说“单元”写的,返回的也是成功写到文件的“块”或者“单元”的个数。
可查看msdn.

另外,文件操作为了提高速度,所以实际每一个的写操作并一定是写到文件里去,可能是写到缓冲里去,
只有当缓冲满,或者强制调用fflush()刷缓冲,或者调用fclose()关闭文件,才把实际内容写到文件
里去。

另外,请问一下lz,你现在是Java native C调用吗?
dontsaymiss 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lengxujun 的回复:]

兄弟你似乎没有调用fclose(),也没有强制刷缓冲。
[/Quote]
加了(*env)->ReleaseByteArrayElements(env, byts, buf,0);没影响,注释掉后再加了fclose解决了,但是为什么呢
七擒关羽 2011-11-09
  • 打赏
  • 举报
回复
fwrite(buf,len,1,fp); 修改如下 fwrite(buf,1,len,fp); 看下fwrite原型

如果不行 if(fp=fopen("/data/data/1.txt","w"))修改这个
if(fp=fopen("/data/data/1.txt","w+"))
"w+"表示如果没有就会创建
dontsaymiss 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lengxujun 的回复:]

兄弟你似乎没有调用fclose(),也没有强制刷缓冲。
[/Quote]
强制刷缓冲?你指的是?
柯本 2011-11-09
  • 打赏
  • 举报
回复
你的jni是C调用JAVA还是JAVA调用C?
查一下fwrite的返回值
加fclose()试一下
dontsaymiss 2011-11-09
  • 打赏
  • 举报
回复
是的,但是这两个问题不会影响到fwrite吧,我想知道的是为什么执行之后1.txt是空文件。你能帮我看看吗[Quote=引用 2 楼 lengxujun 的回复:]

兄弟你似乎没有调用fclose(),也没有强制刷缓冲。
[/Quote]
七擒关羽 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lengxujun 的回复:]
兄弟你似乎没有调用fclose(),也没有强制刷缓冲。
[/Quote]

++点出了问题所在,可以结贴了
lengxujun 2011-11-09
  • 打赏
  • 举报
回复
兄弟你似乎没有调用fclose(),也没有强制刷缓冲。
dontsaymiss 2011-11-09
  • 打赏
  • 举报
回复
最后掉了一个},源代码没有掉,是我发程序的时候自己掉了

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧