最近公司要求將PC平臺下的代碼移植到Android平臺,其中涉及到的ACE開源代碼,雖然ACE比較笨重,但由于種種歷史原因,我不可能將ACE給踢掉重新開發(fā),故需要解決ACE開源庫在Android下的編譯和使用問題,由于工程中使用多個第三方靜態(tài)庫,對于我這種半路出家的純C++程序猿來說,還是有些挑戰(zhàn)的,在此記錄大致過程,以方便其它同學參考,少走些彎路。
成都創(chuàng)新互聯(lián)公司主要從事網(wǎng)站建設、成都網(wǎng)站制作、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務紹興,十余年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:028-86922220
首先請自行安裝Android開發(fā)工具:NDK(r9d)、jdk(jdk1.7.0_45)、ADT(v22.3.0-887826);
ACE——6.0以后的版本已經(jīng)自帶的Android下編譯的MakeFile,本人使用的版本是6.2.4,編譯需要安裝cygwin,請自行安裝,安裝時選擇Devel-install,安裝開發(fā)工具gcc、g++、ld等。
備注:公司歷史版本為5.5.0,由于該版本尚未加入Android Makefile,但并非不支持,但較6.2.4并未出現(xiàn)大的改動,基本可以直接使用,當然如果你偏偏使用了它更改了的代碼的話,就需要你自行修改了。
均安裝完畢后編譯ACE源代碼,進入cygwin
1、設置環(huán)境變量:
編輯~/.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
保存后,執(zhí)行命令 source ~/.bash_profile使其生效;
2、生成交叉編譯環(huán)境
執(zhí)行命令
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
注:本人系統(tǒng)為window7 64bit,故需指定系統(tǒng)版本(--system=windows-x86_64)。
3、ACE源代碼準備
將源代碼解壓到$NDK/sources/ACE-6.2.4目錄下,并作適當?shù)男薷?,分別為:
a、新建ace/config.h文件,內(nèi)容如下
#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,內(nèi)容如下
include $(ACE_ROOT)/include/makeinclude/platform_android.GNU
c、輯$(ACE_ROOT)/ace/Basic_Types.h,在適當位置添加如下代碼:
#if defined(ANDROID)
# include
#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靜態(tài)庫,故需添加如下命令:
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)
相關內(nèi)容請自行添加;
本工程最終生成libNetwork.so文件,鏈接到的靜態(tài)庫均有依賴ACE代碼,故在LOCAL_WHOLE_STATIC_LIBRARIES中將ACE寫在最后面;同時需在其它靜態(tài)庫工程Android.mk文件中同時添加__ACE_INLINE__宏定義,否則在*.so鏈接時會報鏈接錯誤,導致最終生成失敗。