2013-10-15 45 views
1

我有大項目需要futimesfutimens功能。不幸的是,在android ndk include文件夾的頭文件中沒有這樣的函數。是否有解決方法(使用現有函數的存根或簡單代碼片段)?對於futimes功能如何解決android(NDK)中futimes()的缺失?

文檔可以發現here

+0

通過'futime()'函數你的意思是一個函數,記錄文件的修改時間? – Kerry

回答

6

futimes(3)是非POSIX函數,它接受一個struct timeval(秒,微秒)。 POSIX版本是futimens(3),它需要struct timespec(秒,納秒)。後者在仿生libc中可用。

更新:恐怕我有一點點提前了。代碼是checked into AOSP但尚未提供。

但是,如果您查看代碼,則futimens(fd, times)實施爲utimensat(fd, NULL, times, 0),其中utimensat()是看起來在NDK中定義的Linux系統調用。所以你應該能夠根據系統調用提供你自己的futimens()實現。

更新:這使它成爲仿生但不是NDK。以下是如何推出自己的:

// ----- utimensat.h ----- 
#include <sys/stat.h> 
#ifdef __cplusplus 
extern "C" { 
#endif 
int utimensat(int dirfd, const char *pathname, 
     const struct timespec times[2], int flags); 
int futimens(int fd, const struct timespec times[2]); 
#ifdef __cplusplus 
} 
#endif 

// ----- utimensat.c ----- 
#include <sys/syscall.h> 
#include "utimensat.h" 
int utimensat(int dirfd, const char *pathname, 
     const struct timespec times[2], int flags) { 
    return syscall(__NR_utimensat, dirfd, pathname, times, flags); 
} 
int futimens(int fd, const struct timespec times[2]) { 
    return utimensat(fd, NULL, times, 0); 
} 

那些添加到您的項目,包括utimensat.h頭,你應該是好去。用NDK r9b進行測試。

(這應該有適當的ifdef(例如#ifndef HAVE_UTIMENSAT)包裹所以當NDK趕上你可以禁用它。)

更新: AOSP變化here

+0

我無法在獨立工具鏈文件夾(使用'make-standalone-toolchain'腳本)或ndk文件夾中找到任何帶'futimens'定義的頭文件。使用ndk-r9(最新版本) – 4ntoine

+0

哎呦。答案已更新。 – fadden

+0

'utimensat'不適合我。當我在我的android-ndk-r9文件夾中進行grep時,我找不到'utimensat'和'futimens'。 'sys/stat.h'中沒有定義。我需要包括什麼特別的東西? – codingFriend1

相關問題