2013-04-13 70 views
1

我正在嘗試爲桌面和Android製作原生(C++)跨平臺日誌記錄。爲此,我使用實現的日誌方法創建了一個抽象本機Logger類以及適當的繼承類(StdoutLogger,AndroidLogger等)。 因此,由於Android支持本地日誌記錄的是__android_log_print(int prio,const char * tag,const char * fmt,...)方法,它與printf-like語法一起使用的參數數量不確定,所以我將抽象日誌方法用類似的語法工作:Android NDK與stdarg.h相關的問題

virtual void log(int aLogLevel, const char *tag, const char *format, ...)=0; 

那麼,對於傳遞的參數,這些不定數到Android測井方法,我發現我需要使用其他哪些不相同,但需要的va_list代替不定數量的方法的參數。它也存在於log.h中,被稱爲__android_log_vprint(int prio,const char * tag,const char * fmt,va_list ap),所以我只需要傳遞該方法的參數。

問題是,所有這些工作,我需要stdarg.h其中包含我需要的所有東西(如聲明va_list等),但默認情況下,Eclipse無法找到它: 未解決包括:

在Eclipse項目設置我的include目錄包括:

${NDKROOT}/platforms/android-9/arch-arm/usr/include 
${NDKROOT}/sources/cxx-stl/gnu-libstdc++/4.6/include 
${NDKROOT}/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include 

這是很奇怪的是,它缺少的,因爲STDARG.H是C標準庫的一部分。

所以我搜查,發現在這裏,所以我把它添加到包含目錄:

${NDKROOT}/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.6/include 

這個我把它很好地工作之後,但我不能確定這是否是做了正確的道路。

反正以後(實現在另一繼承類的日誌方法時),我遇到了另一個問題關於vfprintf方法:

virtual void Log(int aLogLevel, const char *tag, const char *format, ...) 
{ 
    if (aLogLevel >= loglevel) 
    { 
     va_list args; 
     va_start (args, format); 
     vfprintf (stdout, format, args); 
     va_end (args); 
    } 
} 

Eclipse中指示的錯誤:

Invalid arguments ' Candidates are: int vfprintf(__sFILE *, const char *, char *) ' 

我檢查,顯然它想要一個__va_list(在開始時用__),而不是va_list,它看起來好像顯然不兼容(根據Eclipse)。這vfprintf是在stdio.h中,所以我開始尋找並發現了另一個stdio.h中類似的文件夾中,我發現STDARG.H,所以我增加了它包含目錄太(和它移動到頂部):

${NDKROOT}/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.6/include-fixed 

現在所有的錯誤都消失了,一切似乎都在起作用,但我真的不確定這是否真的是正確的方法。我有最新的Eclipse/CDT/NDK /等。 任何幫助,將不勝感激。

編輯: fadden:謝謝你的回答。這個評論本來就太長了,所以我把它放在這裏。 是的,我使用$ {NDKROOT} /ndk-build.cmd來構建本機部分。

是的,我注意到Eclipse會指出錯誤的情況,所以它甚至不會讓我開始構建應用程序,但是當我重新啓動Eclipse而不打開錯誤所在的文件時,它實際上可以成功構建。但是當我打開它認爲有錯誤的文件時,它不會讓我再次開始構建。所以看起來Eclipse之間的錯誤和實際錯誤(阻止構建)之間存在一些不一致。也許我應該找到一種方法讓它的構建無論指出什麼錯誤,儘管它可能會令人討厭在項目中應該忽略的錯誤,不知道什麼是真實的,哪些不是真正的錯誤......或者只是添加所有需要包含目錄以保持Eclipse開心,到目前爲止它似乎工作,只是不確定這是否真的是正確的方式來做到這一點。謝謝您的幫助。

回答

3

使Eclipse + CDT對Android感到滿意主要是試驗和錯誤。 (爲了讓size_t正常工作,幾天或者幾周已經不可挽回地失去了。)最終,你應該用NDK工具鏈構建,而不是Eclipse,所以只要Eclipse 看起來很開心,你可能會處於良好狀態,因爲最終它不會影響你的二進制文件。

正如你已經注意到的,一些標題(如stdarg.h)由gcc提供,而不是仿生的,所以有必要挖掘一下。如果你有正確的#defines設置(也許__need___va_list ??),我希望有一個定義的地方,相當於__va_listva_list

+0

感謝您的回答。更新了問題。 – scrpn