一、环境准备
1. 基础依赖安装(CentOS 7)
bash
yum install -y gcc gcc-c++ make unzip wget binutils
2. NDK 环境(已预置)
- NDK 路径:
/opt/android-ndk-r21e - 核心:NDK r21e 适配 CentOS 7,是安卓交叉编译的稳定版本
二、源码准备
1. 解压源码
bash
# 假设压缩包在当前目录,解压到指定路径
tar -xjvf ACE+TAO-6.5.13.tar.bz2 -C /tmp/android/
# 进入 ACE 源码根目录(核心路径)
cd /tmp/android/ACE_wrappers
2. 补全安卓专属头文件(6.5.13 版本缺失)
bash
cat > /tmp/android/ACE_wrappers/ace/os_android.h << EOF
#ifndef ACE_OS_ANDROID_H
#define ACE_OS_ANDROID_H
#include "ace/os_bsd_include.h"
#include "ace/os_linux_include.h"
#define ACE_HAS_ANDROID 1
#define ACE_HAS_LINUX 1
#define ACE_HAS_BSD 1
#define ACE_LACKS_SEM_TIMEDWAIT 1
#define ACE_LACKS_PTHREAD_RWLOCK_T 1
#define ACE_LACKS_PTHREAD_RWLOCKATTR_T 1
#define ACE_LACKS_PTHREAD_RWLOCK_INIT 1
#define ACE_LACKS_PTHREAD_RWLOCK_DESTROY 1
#define ACE_LACKS_PTHREAD_RWLOCK_LOCK 1
#define ACE_LACKS_PTHREAD_RWLOCK_UNLOCK 1
#define ACE_LACKS_PTHREAD_RWLOCK_TRYLOCK 1
#define ACE_LACKS_CLOCK_GETTIME 1
#define ACE_LACKS_CLOCK_SETTIME 1
#define ACE_LACKS_CLOCK_GETRES 1
#define ACE_HAS_POSIX_SEM 1
#define ACE_HAS_PTHREADS 1
#define ACE_HAS_SCHED_YIELD 1
#define ACE_HAS_SIGINFO_T 1
#define ACE_OS_NAME android
#define ACE_OS_VERSION ACE_ANDROID_VERSION
#define ACE_HAS_STRDUP 1
#define ACE_HAS_STRCASECMP 1
#define ACE_HAS_STRNCASECMP 1
#define ACE_LACKS_SYSV_IPC 0
#define ACE_LACKS_UNIX_DOMAIN_SOCKETS 0
#undef ACE_HAS_TLS
#define ACE_HAS_TLS 0
#endif // ACE_OS_ANDROID_H
EOF
三、交叉编译工具链生成(arm64-v8a 架构)
bash
# 导出 NDK 路径
export ANDROID_NDK=/opt/android-ndk-r21e
# 生成 arm64-v8a 独立工具链(API 21 适配安卓 5.0+)
$ANDROID_NDK/build/tools/make_standalone_toolchain.py \
--arch arm64 \
--api 21 \
--install-dir /opt/android-toolchain-arm64-v8a
# 配置工具链环境变量
export TOOLCHAIN=/opt/android-toolchain-arm64-v8a
export CC=$TOOLCHAIN/bin/aarch64-linux-android-clang
export CXX=$TOOLCHAIN/bin/aarch64-linux-android-clang++
export AR=$TOOLCHAIN/bin/aarch64-linux-android-ar
export LD=$TOOLCHAIN/bin/aarch64-linux-android-ld
export PATH=$TOOLCHAIN/bin:$PATH
四、ACE 编译配置
1. 设置 ACE_ROOT 环境变量(关键,解决路径错误)
bash
export ACE_ROOT=/tmp/android/ACE_wrappers
2. 创建核心配置文件
(1)ace/config.h(安卓编译核心宏)
bash
cat > $ACE_ROOT/ace/config.h << EOF
#include "config-android.h" // 官方安卓配置头
#define ACE_AS_STATIC_LIBS 1 // 强制静态库
#define ACE_HAS_MUTEXES 1 // 核心:启用互斥锁(ACE_Thread_Mutex依赖)
#define ACE_HAS_RECURSIVE_MUTEXES 1 // 递归锁(可选,增强兼容性)
#define ACE_HAS_THREADS 1 // 显式启用线程(避免官方配置覆盖)
#define ACE_NO_INLINE 1 // 关闭内联,确保符号导出
EOF
(2)include/makeinclude/platform_macros.GNU(编译规则)
bash
mkdir -p $ACE_ROOT/include/makeinclude
cat > $ACE_ROOT/include/makeinclude/platform_macros.GNU << EOF
# 1. 基础编译模式(强制静态库)
static_libs=1
shared_libs=0
build_libs=1
# 2. NDK/架构/API 配置(适配 r21e)
android_ndk := /opt/android-ndk-r21e
android_api := 21
android_abi := arm64-v8a
ANDROID_ABI := $(android_abi)
CROSS_COMPILE := aarch64-linux-android
# 3. 强制指定编译器(严谨版)
CC := $(android_ndk)/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android$(android_api)-clang
CXX := $(android_ndk)/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android$(android_api)-clang++
AR := $(android_ndk)/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar # 替换llvm-ar为原生ar(避免符号问题)
RANLIB := $(android_ndk)/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ranlib
# 4. 先定义核心宏(关键!避免被官方配置覆盖)
# 基础宏(线程/互斥锁核心)
CPPFLAGS += -DACE_HAS_THREADS=1
CPPFLAGS += -DACE_HAS_MUTEXES=1
CPPFLAGS += -DACE_HAS_RECURSIVE_MUTEXES=1
CPPFLAGS += -DACE_HAS_PTHREADS=1
CPPFLAGS += -DACE_HAS_PTHREADS_STUBS=1
# 系统兼容宏
CPPFLAGS += -DACE_HAS_ALLENGLISH=1
CPPFLAGS += -DACE_HAS_ANSI_CPP=1
CPPFLAGS += -DACE_HAS_SOCKETS=1
CPPFLAGS += -DACE_HAS_NETDB_H=1
CPPFLAGS += -DACE_HAS_ARPA_INET_H=1
CPPFLAGS += -DACE_HAS_INET_NTOP=1
CPPFLAGS += -DACE_HAS_INET_PTON=1
CPPFLAGS += -DACE_HAS_STRCASECMP=1
CPPFLAGS += -DACE_HAS_STRNCASECMP=1
CPPFLAGS += -DACE_HAS_TIME_POLICY=1
CPPFLAGS += -DACE_HAS_STANDARD_CPP_LIBRARY=1
CPPFLAGS += -DACE_USES_STD_NAMESPACE=1
CPPFLAGS += -DACE_HAS_MALLOC=1
CPPFLAGS += -DACE_HAS_MEMCPY=1
CPPFLAGS += -DACE_HAS_STRING_H=1
CPPFLAGS += -DACE_HAS_CSTRING=1
CPPFLAGS += -DACE_HAS_ITOAM=1
# NDK版本宏
CPPFLAGS += -D__NDK_MAJOR__=21 -D__NDK_MINOR__=0
# 5. 再导入官方配置(避免覆盖自定义宏)
include $(ACE_ROOT)/include/makeinclude/platform_android.GNU
# 6. 编译参数(调整C++标准+补全)
CXXFLAGS += -std=c++11 // 替换c++98为c++11(ACE 6.x+兼容更好)
CXXFLAGS += -fPIC -march=armv8-a // PIC+armv8-a架构
CXXFLAGS += -DANDROID -D__ANDROID_API__=$(android_api) // 显式指定安卓API
# 链接参数
LDFLAGS += -march=armv8-a -lpthread -ldl -lm -llog // 补全llog(安卓日志库)
LIBS += -lpthread -ldl -lm -llog
EOF
五、编译 ACE 静态库
1. 仅编译核心库(跳过测试/示例,加速)
bash
cd $ACE_ROOT
# 清理残留(可选)
make -C ace clean
# 编译核心库(-j 后接CPU核心数,如 -j4)
make -C ace -j4
2. 全量编译(可选,耗时久)
bash
# 我这里用的是这个
cd $ACE_ROOT
make clean
make -j4
六、编译结果验证
1. 库文件位置
| 编译方式 | libACE.a 路径 |
|---|---|
| 全量编译 | /tmp/android/ACE_wrappers/lib//.a |
2. 验证安卓架构(核心)
bash
# 检查库架构(arm64-v8a 特征:ELF64 + AArch64)
$TOOLCHAIN/bin/aarch64-linux-android-readelf -h /tmp/android/ACE_wrappers/ace/libACE.a | grep -E "Class|Machine"
-
正确输出:
Class: ELF64 Machine: AArch64

3. 验证安卓特征
bash
# 确认 ACE 安卓适配宏
$TOOLCHAIN/bin/aarch64-linux-android-objdump -s /tmp/android/ACE_wrappers/ace/libACE.a | grep -i "ace_has_android"
# 输出 ACE_HAS_ANDROID=1 即验证通过
七、头文件整理(自动化脚本)
1. 创建整理脚本(整理ACE头文件.sh)
bash
#!/bin/bash
set -e
# 配置项
ACE_SRC_DIR="/tmp/android/ACE_wrappers/ace"
OUTPUT_DIR="/opt/ace-android/arm64-v8a/include"
# 创建输出目录
echo "【1/4】创建输出目录: $OUTPUT_DIR"
mkdir -p "$OUTPUT_DIR/ace"
# 仅拷贝头文件(.h/.hpp)
echo -e "\n【2/4】拷贝 ACE 头文件..."
find "$ACE_SRC_DIR" -maxdepth 1 -type f \( -name "*.h" -o -name "*.hpp" \) -exec cp {} "$OUTPUT_DIR/ace/" \;
find "$ACE_SRC_DIR" -mindepth 2 -type f \( -name "*.h" -o -name "*.hpp" \) | while read -r file; do
target_path="$OUTPUT_DIR/ace/$(dirname "${file#$ACE_SRC_DIR/}")"
mkdir -p "$target_path"
cp "$file" "$target_path/"
done
# 清理冗余文件
echo -e "\n【3/4】清理冗余文件..."
find "$OUTPUT_DIR/ace" -type f ! \( -name "*.h" -o -name "*.hpp" \) -delete
# 验证核心头文件(适配 6.5.13)
echo -e "\n【4/4】验证核心头文件..."
CORE_HEADERS=(
"$OUTPUT_DIR/ace/ACE.h"
"$OUTPUT_DIR/ace/SOCK.h"
"$OUTPUT_DIR/ace/Thread.h"
"$OUTPUT_DIR/ace/os_android.h"
)
missing_headers=()
for header in "${CORE_HEADERS[@]}"; do
if [ ! -f "$header" ]; then
missing_headers+=("$header")
else
echo "✅ 存在核心头文件: $header"
fi
done
if [ ${#missing_headers[@]} -ne 0 ]; then
echo -e "\n❌ 缺失核心头文件: "
for missing in "${missing_headers[@]}"; do
echo " $missing"
done
exit 1
else
echo -e "\n🎉 ACE 头文件整理完成!"
echo "📌 整理后路径: $OUTPUT_DIR/ace"
fi
2. 执行脚本
bash
chmod +x 整理ACE头文件.sh
./整理ACE头文件.sh
八、最终文件整理(方便安卓项目使用)
bash
# 创建统一目录,整合库和头文件
mkdir -p /opt/ace-android/arm64-v8a/lib
# 拷贝静态库
cp /tmp/android/ACE_wrappers/ace/libACE.a /opt/ace-android/arm64-v8a/lib/
# 头文件已通过脚本整理到 /opt/ace-android/arm64-v8a/include/ace
九、安卓项目集成(示例)
1. CMake 配置
cmake
cmake_minimum_required(VERSION 3.10)
project(android_ace_demo)
# 引入 ACE 头文件
include_directories(/opt/ace-android/arm64-v8a/include)
# 引入 ACE 库路径
link_directories(/opt/ace-android/arm64-v8a/lib)
# 编译测试程序
add_executable(demo main.cpp)
# 链接 ACE 库及安卓系统库
target_link_libraries(demo libACE.a pthread dl)
2. Android.mk 配置
makefile
LOCAL_C_INCLUDES += /opt/ace-android/arm64-v8a/include
LOCAL_LDLIBS += -L/opt/ace-android/arm64-v8a/lib -lACE -lpthread -ldl
LOCAL_ABI_FILTERS := arm64-v8a # 匹配编译架构
十、其他架构编译(可选,如 armeabi-v7a)
bash
# 生成 armeabi-v7a 工具链
$ANDROID_NDK/build/tools/make_standalone_toolchain.py \
--arch arm \
--api 21 \
--install-dir /opt/android-toolchain-armeabi-v7a
# 重新配置环境变量
export TOOLCHAIN=/opt/android-toolchain-armeabi-v7a
export CC=$TOOLCHAIN/bin/arm-linux-androideabi-clang
export CXX=$TOOLCHAIN/bin/arm-linux-androideabi-clang++
export AR=$TOOLCHAIN/bin/arm-linux-androideabi-ar
export LD=$TOOLCHAIN/bin/arm-linux-androideabi-ld
# 重新编译核心库
cd $ACE_ROOT
make -C ace clean && make -C ace -j4
# 验证架构(armeabi-v7a 特征:ELF32 + ARM)
$TOOLCHAIN/bin/arm-linux-androideabi-readelf -h /tmp/android/ACE_wrappers/ace/libACE.a | grep -E "Class|Machine"
核心总结
- 最终可用文件:
- 静态库:
/opt/ace-android/arm64-v8a/lib/libACE.a - 头文件:
/opt/ace-android/arm64-v8a/include/ace/
- 静态库:
- 适配环境:安卓 5.0+(API 21)、arm64-v8a 架构;
- 关键注意:ACE 6.5.13 需手动补
os_android.h,Socket 头文件为SOCK.h而非Socket.h; - 编译优化:用
make -C ace仅编译核心库,避免测试用例耗时。