您好,登錄后才能下訂單哦!
最近公司要求將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鏈接時會報鏈接錯誤,導致最終生成失敗。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。