前言:這裡我記錄下我開發cocos2dx for Android所遇到的問題吧,也許有很多人跟我一樣很迷茫,能記錄一點是一點了,希望能做成一個系列協助到大家,當然,最初還是協助到我自己,我記性比較差。說實話,編譯這個真的好多坑。
這段時間為在cocos2dx上找一個跨平台的socket通訊庫而煩惱(說實話,之前因為一直是寫windows上伺服器的,並且接觸的東西也不深入,所以現在搞起來有點捉襟見肘,凡事總有個難的時候,現在說實話我倒是挺開心並且別人也挺羨慕我能專心研究這塊領域的,老闆也是,呵呵),找來找去無非就這幾種辦法:
- 自己用BSD規範寫一個,比如ODSocket(謝謝提供這個的朋友)
- 找一個通用的庫實現
其實是都嘗試過,第一個現在還算是備選方案,主要還是想找一個好用的通用的庫來做這個事情,於是我找來找去就找到了libevent,網上搜了下,貌似也有成功在iOS、windows、Android上成功編譯通過並能用的例子。iOS上倒更好,直接有人把編譯好的幾個靜態庫檔案分享權限設定出來,Android上有人這麼搞就好了,當然,如果我編譯好了,會共用給大家的。
準備工作下載libevent源碼
首先去git上下一個專門給Android用的libevent(應該只是多寫了一個Android.mk),:https://github.com/ventureresearch/libevent 然後釋放到本地。
釋放的話,因為下載過來的是zip格式的,可以運行unzip命令釋放,如果沒有,則用sudo apt-get install unzip 裝一個即可(前提要連網)
運行環境
我這裡以ubuntu為例子,ubuntu我是裝了個虛擬機器,然後使用的是12.04.2 LTS 64位server版,檔案分享權限設定的話直接裝個winscp即可,然後如果ssh過不去的話在ubuntu上安裝一個openssh,如:sudo apt-get install openssh 一路按yes到末尾即可。至於winscp怎麼用我就不贅述了,自己去google或者百度,或者直接開啟用下看就懂了。
編譯準備
在釋放的檔案中,先運行./autogen.sh,先產生對應的configure檔案,其間可能需要automake和libtool,沒有的話請用老辦法 sudo apt-get install xxx 自行安裝。
autogen.sh運行結束後,目錄下應該會多出許多configure相關的檔案,還有install.sh檔案等等。
匯出環境變數直接在命令列裡面輸入
export NDK_ROOT=work/Android/android-ndk-r8e
export PATH=$PATH:$NDK_ROOT/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86_64/bin
當然,NDK這個自己首先要下載好,請根據自己的機器和作業系統下載對應的版本,我機器使用的是NDK是r8e linux64位的版本。後面加入到PATH是為了能找到arm-linux-androideabi-gcc這個編譯器
寫configure.sh這個檔案可有可無,但是我這裡因為編寫得比較坎坷,每次如果都重新輸入命令,太累人了,就寫個指令碼,每次跑下好了。內容如下:
#! /bin/sh ./configure \ --host=arm-linux-androideabi \ CC=arm-linux-androideabi-gcc \ LD=arm-linux-androideabi-ld \ CPPFLAGS="-I$NDK_ROOT/platforms/android-14/arch-arm/usr/include/" \ CFLAGS="-nostdlib" \ LDFLAGS="-Wl,-rpath-link=$NDK_ROOT/platforms/android-14/arch-arm/usr/lib/ -L$NDK_ROOT/platforms/android-14/arch-arm/usr/lib/" \ LIBS="-lc -lgcc -L$NDK_ROOT/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.7"
這雷根據自己機器上的環境配置,這裡配置的是android-14的platform,然後對應的編譯工具是使用4.7的。
這裡有個要注意的地方,因為arm本身不支援浮點運算,所以要通過軟浮點庫來實現,這個庫就是libgcc.a,所以這裡要串連-lgcc,並且對應的庫已經在toolchains中提供了,後面的目錄是指明libgcc.a的位置。make後面的test例子的時候有用到對應的除法,可能會報XXXMOD未定義之類的。
在目錄下執行指令碼直接輸入./configure.sh即可,這樣一下應該木有什麼其他問題了,如果有請根據提示(一般會在當前檔案夾下config.log檔案中記錄日誌)修正。我之前是有報找不到C的編譯庫,然後arm-linux-androideabi-gcc這個找不到,最後發現是export的時候,目錄寫錯了,少了個64,汗,請不要隨便複製。建立兩個庫檔案的軟串連這裡看了Stack Overflow上的文章,貌似NDK的toolchain不會去指定的lib目錄下找庫檔案,所以會報crtbegin_so.o和crtend_so.o找不到的問題。這個就用土辦法解決,直接在目前的目錄下建立對應檔案的軟串連即可,如下:
ln -s $NDK_ROOT/platforms/android-14/arch-arm/usr/lib/crtbegin_so.oln -s $NDK_ROOT/platforms/android-14/arch-arm/usr/lib/crtend_so.o
這樣,當前libevent目錄下就會有這兩個檔案的軟串連,等下make的時候也就不會報這兩個檔案找不到了。當然,我這裡是相當於把問題都說在前面了,當然大家也可以先make後再解決這個問題,畢竟我是這條彎路上走過來的執行make經過configure.sh後,就會產生Makefile檔案了,可以開啟看下,不過量好大,我是沒仔細看。如果一路成功以後,對應的庫檔案就都產生在.libs目錄中,還是個隱藏檔案,直接把裡面的幾個.a檔案拷出來即可。我附件中也會提供對應的庫檔案。參考文章
- 這篇文章是第一篇我覺得libevent可行的參考 http://blog.csdn.net/optman/article/details/8651458
- 這篇文章讓我放棄了cgywin轉到Ubuntu上編譯 http://blog.csdn.net/optman/article/details/8651458
- 這篇Stack Overflow基本就是我交叉編譯的參考 http://stackoverflow.com/questions/11655911/cross-compiling-libevent-for-android
- make後報錯,對應的crtbegin_so.o和crtend_so.o找不到的解決方案 http://stackoverflow.com/questions/6881164/crtbegin-so-o-missing-for-android-toolchain-custom-build
- 草根老師的部落格,關於浮點運算報錯的文章 http://blog.chinaunix.net/uid-26833883-id-3282967.html
- 這篇文章是講如何用NDK編譯開源庫的,篇幅太大,我沒仔細看,但是應該很有協助 http://warpedtimes.wordpress.com/2010/02/03/building-open-source-libraries-with-android-ndk/
檔案下載libevent庫下載,一共4個,分別是libevent.a、libevent_core.a、libevent_extra.a、libevent_pthreads.a下載