0

我想检查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

4

2 回答 2

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 不支持statfssyscall,而在于您的代码。在我看来,与android_os_StatFs.cpp您使用错误标题的代码进行比较。其中android_os_StatFs.cpp使用了以下标题:

#if INCLUDE_SYS_MOUNT_FOR_STATFS
#include <sys/mount.h>
#else
#include <sys/statfs.h>
#endif
于 2012-05-29T08:19:20.197 回答
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 文件中的内部存储(不确定,我没有检查如果删除用户权限会发生什么)。

于 2015-12-05T15:06:38.143 回答