Android下使用ACE開源網絡庫

   最近公司要求將PC平臺下的代碼移植到Android平臺,其中涉及到的ACE開源代碼,雖然ACE比較笨重,但由於種種歷史原因,我不可能將ACE給踢掉重新開發,故需要解決ACE開源庫在Android下的編譯和使用問題,由於工程中使用多個第三方靜態庫,對於我這種半路出家的純C++程序猿來說,還是有些挑戰的,在此記錄大致過程,以方便其它同學參考,少走些彎路。

   首先請自行安裝Android開發工具:NDK(r9d)、jdk(jdk1.7.0_45)、ADT(v22.3.0-887826);

   ACE——6.0以後的版本已經自帶的Android下編譯的MakeFile,本人使用的版本是6.2.4,編譯需要安裝cygwin,請自行安裝,安裝時選擇Devel-install,安裝開發工具gcc、g++、ld等。

   備註:公司歷史版本爲5.5.0,由於該版本尚未加入Android Makefile,但並非不支持,但較6.2.4並未出現大的改動,基本可以直接使用,當然如果你偏偏使用了它更改了的代碼的話,就需要你自行修改了。

   均安裝完畢後編譯ACE源代碼,進入cygwin

   1、設置環境變量:

   編輯~/.bash_profile文件,在最下方添加   

    NDK=D:/android-ndk-r9d

    export NDK

    

     ACE_ROOT=$NDK/sources/ACE-6.2.4

    export ACE_ROOT

    

    ANDROID_ARCH=arm

    export ANDROID_ARCH

    

    SYSROOT=$NDK/platforms/android-9/arch-arm

    export SYSROOT

    

    PATH=$PATH:$ACE_ROOT/toolchain/bin

    export PATH

   保存後,執行命令 source ~/.bash_profile使其生效;

   2、生成交叉編譯環境

   執行命令

   cd $NDK

   ./build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.6 --arch=arm --platform=android-9 --install-dir=./sources/ACE-6.2.4/toolchain --system=windows-x86_64

   注:本人系統爲window7 64bit,故需指定系統版本(--system=windows-x86_64)。

   3、ACE源代碼準備

   將源代碼解壓到$NDK/sources/ACE-6.2.4目錄下,並作適當的修改,分別爲:

   a、新建ace/config.h文件,內容如下   

    #ifndef __ACE_INLINE__

    #define __ACE_INLINE__

    #endif

    #ifdef WIN32

    #include "ace/config-win32.h"

    #else

    #include "ace/config-android.h"

    #endif

   b、新建include/makeinclude/platform_macros.GNU文件,指定makefile,內容如下

               include $(ACE_ROOT)/include/makeinclude/platform_android.GNU

          c、輯$(ACE_ROOT)/ace/Basic_Types.h,在適當位置添加如下代碼:        

    #if defined(ANDROID)

    #  include <sys/endian.h>

    #endif

    備註:由於在單獨使用ace/ACE.h或ace/Basic_Types.h時,ACE對ACE_BYTE_ORDER的定義自相矛盾,所以此處在判斷出是Android時,強行導入android下的大小頭定義文件。

          d、打開$(ACE_ROOT)/include/makeinclude/platform_android.GNU, 並加入如下代碼:

               CPPFLAGS += -DANDROID

               編譯ACE靜態庫,故需添加如下命令:

                static_libs=1

               備註:如果提示arm-linux-androideabi-g++不存在,請在此文件中CROSS_COMPILE的定義處修改爲:

                CROSS_COMPILE=$(ACE_ROOT)/toolchain/bin/arm-linux-androideabi-

            4、編譯

                只編譯ACE源代碼,不編譯sample等其它代碼,進入

    cd $ACE_ROOT/ace

    make

     等待編譯完成,會自動生成到$ACE_ROOT/lib目錄。

   5、使用

     在此列出其中一個工程使用libACE.a的android.mk文件

    LOCAL_PATH := $(call my-dir)

    

    include $(CLEAR_VARS)

    

    LOCAL_ARM_MODE := arm

    LOCAL_MODULE := libNetwork

    LOCAL_MODULE_TAGS := optional

    LOCAL_CPP_EXTENSION := .cpp

    LOCAL_SRC_FILES := \

    

    LOCAL_C_INCLUDES := \

        $(LOCAL_PATH)

    

    LOCAL_CFLAGS := \

       '-DANDROID' \

       '-DANDROID_ACE' \

       '-D__ACE_INLINE__'

    

    LOCAL_WHOLE_STATIC_LIBRARIES := \

     p2p_lib \

     p2p_client \

     p2p_media \

     ACE

    

    LOCAL_SHARED_LIBRARIES := \

     libstlport

    

    LOCAL_LDLIBS += -llog -ljnigraphics -lz -landroid

        

    include $(BUILD_SHARED_LIBRARY)

     相關內容請自行添加;

     本工程最終生成libNetwork.so文件,鏈接到的靜態庫均有依賴ACE代碼,故在LOCAL_WHOLE_STATIC_LIBRARIES中將ACE寫在最後面;同時需在其它靜態庫工程Android.mk文件中同時添加__ACE_INLINE__宏定義,否則在*.so鏈接時會報鏈接錯誤,導致最終生成失敗。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章