我想检查android是否支持系统调用,statfs()。 所以,我做了以下代码来检查它(它是通过ndk编译的):
#include <sys/vfs.h>
#include <stdio.h>
int main()
{
struct statfs diskInfo;
statfs("/data",&diskInfo);
perror("statfs,/data");
unsigned long long blocksize = diskInfo.f_bsize;
unsigned long long totalsize = blocksize * diskInfo.f_blocks;
printf("new TOTAL_SIZE == %lu MB/n",totalsize>>20);
unsigned long long freeDisk = diskInfo.f_bfree*blocksize;
printf("DISK_FREE == %ld MB/n",freeDisk>>20);
return 0;
}
在编译期间没有错误。但是当它通过adb在Android模拟器中运行时,它会提示以下内容:
kaiwii@ubuntu:~$ adb shell /data/pwrite/test2
statfs,/data: No such file or directory
new TOTAL_SIZE == 0 MB/nDISK_FREE == 0 MB/n
任何想法?thx
答案 0 :(得分:0)
实际上,Android中使用statfs来发现可用空间。正如@MH所指出的那样,起点是StatFs.java
类。您可以在frameworks/base/core/jni/android_os_StatFs.cpp
中找到本机函数的实现。例如,要获得空闲块,它将实现以下功能:
static jint
android_os_StatFs_getFreeBlocks(JNIEnv *env, jobject thiz)
{
struct statfs *stat = (struct statfs *)env->GetIntField(thiz, fields.context);
return stat->f_bfree;
}
因此,问题不在于Android不支持statfs
系统调用,问题在于您的代码。就我而言,与android_os_StatFs.cpp
中的代码相比,您使用了错误的标题。在android_os_StatFs.cpp
中,使用了以下标题:
#if INCLUDE_SYS_MOUNT_FOR_STATFS
#include <sys/mount.h>
#else
#include <sys/statfs.h>
#endif
答案 1 :(得分:0)
我遇到了同样的问题(statfs返回0字节可用)。我修复了fstatfs(...)替换statfs(...)调用。以下代码适用于我(在Android 4.2和5.0上测试):
#include <sys/statfs.h>
typedef unsigned long long msize;
msize getAvailableDiskSpace() {
struct statfs data;
if (fstatfs(NULL, &data) < 0)
return 0;
return (msize)data.f_bsize * data.f_bfree;
}
可能你还需要允许访问mainfest文件中的内部存储(不确定,我没有检查如果删除用户权限会发生什么)。