2017-06-17 6 views
0

Androidのネイティブコードをコンパイルする際に問題があります。私は、コンパイル時にこのエラーが発生します:構造体スタットのヘッダファイルで構造体statのAndroid NDKコンパイルエラー

'struct stat' has no member named 'st_ctim' 

構造体は、「ファイルのst_ctime」と呼ばれている(最後の「e」を気づか)

は私がコンパイルできる方法はありますそれを変更せずにコードですか? 'st_ctime'ではなく 'st_ctim'というメンバを含むstruct stat(stat.h)に付属している、アンドロイドのネイティブAPIのバージョンはありますか?

AndroidのネイティブAPIレベル26に対してコンパイルしています。これまでのところ、APIレベル8,9,23では同じ問題があります。

私はst_ctimの問題を報告するんだけど、他のすべてのメンバーは、明確にする目的のために「E」(st_atimeを、st_mtimeの両)

で終わり、なぜlibcの構造体スタットとAndroidのネイティブ構造体スタット間の差があります?

+0

それはどの言語ですか?さまざまな言語のタグをスパムしないでください! – Olaf

+0

@Olafこれは言語C++です。何か迷惑メールはありましたか?コンパイラとしてarm-linux-androideabi-g ++を使用しています。コンパイルしようとしているソースコードはC++で書かれています – jav974

+0

はい、CはC++ではありません。彼らは異なった言語です! – Olaf

答えて

0

st_ctimは、statの新しいメンバであり、ナノ秒の精度の時間(struct timespec)を含みます。残念ながら、アンドロイドはそれを持っていません。ここで(Linuxマシンの)LSTATのマニュアルの抜粋です:

struct stat { 
     /* I stripped several members here (st_mode, etc.) */ 

     /* Since Linux 2.6, the kernel supports nanosecond 
     precision for the following timestamp fields. 
     For the details before Linux 2.6, see NOTES. */ 

     struct timespec st_atim; /* time of last access */ 
     struct timespec st_mtim; /* time of last modification */ 
     struct timespec st_ctim; /* time of last status change */ 

#define st_atime st_atim.tv_sec  /* Backward compatibility */ 
#define st_mtime st_mtim.tv_sec 
#define st_ctime st_ctim.tv_sec 
}; 

古いカーネルと古い基準はナノ秒 タイムスタンプフィールドをサポートしていませんでした。代わりに、タイムスタンプ fields-st_atime、 st_mtime、タイムスタンプst_typeとして1秒の精度でタイムスタンプを記録したタイムスタンプが3つありました。

カーネル2.5.48以降、stat構造体は3つのファイルタイムスタンプフィールドのナノ秒の分解能をサポートしています。適切な機能テストマクロが定義されている場合は、 の のナノ秒の各タイムスタンプは、st_atim.tv_nsecという形式の名前で利用できます。 ナノチューブタイムスタンプはPOSIX.1-2008で標準化されていました。バージョン2.12以降は、_POSIX_C_SOURCEが で値が200809L以上、_XOPEN_SOURCEが700以上で定義されている場合、glibcはナノ秒のコンポーネント名を公開します。 glibc 2.19までの範囲では、_BSD_SOURCEまたは_SVID_SOURCEが定義されている場合、ナノ秒コンポーネントの定義も定義されています( )。前述のマクロのどれも定義されていない場合、ナノ秒の値はst_atimensecという形式の名前で公開されます。

あなたのコードはこの新機能に依存しているので、st_ctimではなくst_ctimeを使用して修正する必要があります。

+0

チップをありがとう! ok私はそれに応じてコードを変更し、今このステップを通過します。私はそれが私のコードではないので、私はそれをしたくなかったが、私は他の選択肢がないと思う。 thx – jav974

+0

"残念ながら、アンドロイドはそれを持っていません。"あなたが近代的なNDKを使っているなら、これは当てはまりません。 –

1

あなたはNDKの現代版を使用している場合は、struct stat現代の必要があります:あなたは日付ヘッダまでを取得するために、NDKのunified headersを使用する必要がhttps://android.googlesource.com/platform/bionic/+/master/libc/include/sys/stat.h

注意を。これはr15のデフォルトですが、r14のオプトインです。

+0

面白いことに、クロスコンパイルのためのツールチェーンを使用していますが、これは統一ヘッダーを使用するオプションを参照していません...最新のndk r15も使用しています。 gcc/g ++ビルドシステムの代わりに、統一ヘッダーと2-clangを使用して1に更新します! – jav974

+0

toolchains/blahから直接コンパイラを使用し、すべてのコンパイラフラグを自分で設定する場合のように、 "prebuilt toolchain"?あなたが意味するものなら、[スタンドアロンのツールチェーン](https://developer.android.com/ndk/guides/standalone_toolchain.html)を試してみてください。 –