android似乎不支持statfs()

时间:2012-05-29 07:22:10

标签: android linux android-ndk linux-kernel

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

2 个答案:

答案 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文件中的内部存储(不确定,我没有检查如果删除用户权限会发生什么)。