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;
}

statfsしたがって、問題は Android がsyscall をサポートしていないことではなく、問題はコードにあります。私の見解では、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 バイトを返します)。statfs(...) 呼び出しを fstatfs(...) に置き換えて修正しました。次のコードは私にとってはうまくいきます(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;
}

おそらく、メインフェスト ファイルの内部ストレージへのアクセスも許可する必要があります (ユーザー権限を削除するとどうなるかは確認していません)。

于 2015-12-05T15:06:38.143 に答える