gpt4 book ai didi

android 似乎不支持 statfs()

转载 作者:太空宇宙 更新时间:2023-11-04 04:24:01 25 4
gpt4 key购买 nike

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

编译时没有报错,但是在android模拟器中通过adb运行时,提示如下:

kaiwii@ubuntu:~$ adb shell /data/pwrite/test2
statfs,/data: No such file or directory
new TOTAL_SIZE == 0 MB/nDISK_FREE == 0 MB/n

有什么想法吗?谢谢

最佳答案

实际上,Android 中使用 statfs 来发现可用空间。正如@MH 指出的那样,起点是 StatFs.java 类。您可以在frameworks/base/core/jni/android_os_StatFs.cpp中找到 native 函数的实现。例如,为了获取空闲 block ,它实现了以下函数:

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 中的代码相比,您使用了错误的 header 。在 android_os_StatFs.cpp 中使用了以下 header :

#if INCLUDE_SYS_MOUNT_FOR_STATFS
#include <sys/mount.h>
#else
#include <sys/statfs.h>
#endif

关于android 似乎不支持 statfs(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10794730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com