android似乎不支持statfs()

android似乎不支持statfs(),android,linux,android-ndk,linux-kernel,Android,Linux,Android Ndk,Linux Kernel,我想检查android是否支持系统调用statfs()。 因此,我编写了以下代码来检查它(它是通过ndk编译的): 有什么想法吗?thx实际上,Android中使用statfs来发现可用空间。正如@MH所指出的,起点是StatFs.javaclass。本机函数的实现可以在frameworks/base/core/jni/android\u os\u StatFs.cpp中找到。例如,为了获得空闲块,它实现以下功能: static jint android_os_StatFs_getFreeBlo

我想检查android是否支持系统调用statfs()。 因此,我编写了以下代码来检查它(它是通过ndk编译的):


有什么想法吗?thx

实际上,Android中使用statfs来发现可用空间。正如@MH所指出的,起点是
StatFs.java
class。本机函数的实现可以在
frameworks/base/core/jni/android\u os\u 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
syscall,问题在于您的代码。在我看来,与
android\u os\u StatFs.cpp
中的代码相比,您使用了错误的头。在
android\u os\u StatFs.cpp
中,使用了以下标题:

#if INCLUDE_SYS_MOUNT_FOR_STATFS
#include <sys/mount.h>
#else
#include <sys/statfs.h>
#endif
#如果包括用于状态的系统安装#
#包括
#否则
#包括
#恩迪夫
我遇到了同样的问题(statfs返回0个可用字节)。我修复了用fstatfs(…)替换statfs(…)调用的问题。以下代码适合我(在Android 4.2和5.0上测试):

#包括
typedef无符号长msize;
msize getAvailableDiskSpace(){
结构statfs数据;
if(fstatfs(NULL,&data)<0)
返回0;
返回(msize)data.f_bsize*data.f_bfree;
}

您可能还需要允许访问mainfest文件中的内部存储(不确定,我没有检查如果删除用户权限会发生什么情况)。

您知道Android提供了一个新的功能吗?如果这不符合您的需要,您可能需要检查它的实现,尽管根据描述,它可能只会包装对Unix命令的调用。是的。但是,我需要使用systemcall本身。那么,您确定emulator上有文件或目录/数据吗?如果你只使用“/”,会发生什么?当然。我也尝试了“/”,但它也失败了。分析非常好。但是,当我将标题切换为:#包含#包含时,同样的错误出现。还有什么想法吗?按照我的观点,你应该使用而不是。不知道,为什么会发生这种错误。但请尝试对diskInfo使用动态内存分配。在android_os_StatFs.cpp中,他们使用动态分配。我可以参考哪种方法?我查看了整个android_os_StatFs.cpp,但找不到它。我们来看看两种设置环境的方法:android_os_StatFs_native_设置和android_os_StatFs_native_restat。
static jint
android_os_StatFs_getFreeBlocks(JNIEnv *env, jobject thiz)
{
    struct statfs *stat = (struct statfs *)env->GetIntField(thiz, fields.context);
    return stat->f_bfree;
}
#if INCLUDE_SYS_MOUNT_FOR_STATFS
#include <sys/mount.h>
#else
#include <sys/statfs.h>
#endif
#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;
}